PDA

View Full Version : سوال: بدست آوردن لیست تمام پروسه های



hoax3r
چهارشنبه 19 تیر 1387, 21:30 عصر
با سلام

میخوام بدونم چه API های یا چه راهایی هست که لیست تمام پروسه ها رو بگیریم
میدونم با CreateToolhelp32Snapshot و EnumProcesses میشه اینکارو کرد
ولی راهی که پروسه که توسط rootkit مخفی شده رو نشون بده می خوام
مثلا برنامه HideToolz رو اگه دیده باشین وقتی بازش میکنیم هر برنامه آی نمیتونه ببینتش

ببخشد اگر سوالم کمی کلی شد

با تشکر

vcldeveloper
چهارشنبه 19 تیر 1387, 23:43 عصر
راهی که پروسه که توسط rootkit مخفی شده رو نشون بده می خوام
مثلا برنامه HideToolz رو اگه دیده باشین وقتی بازش میکنیم هر برنامه آی نمیتونه ببینتش
برای اینکه rootkit ها هم نمایش داده بشند، باید حداقل از توابع سطح کرنل استفاده کنید. توابع CreateToolhelp32Snapshot و EnumProcesses توابع سطح یوزر هستند و معلوم هست که نمی توانند لیست برنامه های سطح کرنل را نمایش دهند.

hoax3r
چهارشنبه 19 تیر 1387, 23:49 عصر
ممنون ، مشکل منم همینه که نمیدونم چه توابع کرنلی باید استفاده بشه
امیدوارم تنها راه نوشتن سرویس نباشه، ممنون میشم راهنمایی کنید
با تشکر

ICEMAN
پنج شنبه 20 تیر 1387, 19:34 عصر
#include <windows.h>
#include <winuser.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <iostream>
using std ::cout;
using std ::endl;
using std ::left;
#include <iomanip>
using std ::setw;

void WalkHeapList(HANDLE, DWORD);

void main(int argc , char* argv[])
{
DWORD Process_TID;
HANDLE ProcessHandle;
// DWORD Reserved;
PROCESSENTRY32 proc;
HANDLE snapshot;
char process_name[32]="";
int gotime=0; //did we find'em?
proc.dwSize = sizeof(proc);
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
Process32First(snapshot, &proc);

if( argc==2 )
{
if( strlen(argv[1])+1 > sizeof(process_name) )
{
printf("Process request exceeds buffer limitations");
exit(1);
}
else
{
strcpy( process_name,argv[1] );
printf( "\nLooking for %s",argv[1] );
}
}

cout <<"Process name" <<setw(8) <<"PID" << setw(6) <<"T"<<endl;
do {// Find the Given Process
if(strcmp(proc.szExeFile,process_name)==0)
{
if(argc==2)
{
printf("\nKilling %s:%d",proc.szExeFile,proc.th32ProcessID);
Process_TID = proc.th32ProcessID;
gotime++;
}
}

else
{
if(argc==1)
{
cout << '\n'<<left<<setw(18) <<proc.szExeFile
<<":" <<proc.th32ProcessID
<<'\t' <<"Thread :" <<proc.cntThreads
<<'\t' <<"pPID :" <<proc.th32ParentProcessID;
proc.


WalkHeapList(snapshot, proc.th32ProcessID);
}
}
} while ( Process32Next(snapshot, &proc) );

CloseHandle(snapshot);
// Get the Process's handle and blow it
// away
if( gotime > 0 )
{
ProcessHandle= OpenProcess( PROCESS_ALL_ACCESS | PROCESS_TERMINATE
, FALSE, Process_TID );
TerminateProcess( ProcessHandle, (DWORD)0 );
}
}


void WalkHeapList( HANDLE snapshot, DWORD PID )
{
HEAPLIST32 heap;
HEAPENTRY32 block;
unsigned long heapsize;
unsigned long freesize;

heap.dwSize= sizeof(heap);
block.dwSize= sizeof(block);

Heap32ListFirst( snapshot, &heap );

do {
heapsize = 0;
freesize = 0;
if ( Heap32First(&block, PID, heap.th32HeapID) )
{
do {
heapsize += block.dwBlockSize;
if (block.dwFlags & LF32_FREE)
freesize += block.dwBlockSize;
} while( Heap32Next(&block) );

cout <<"\n\tHeap : " <<heapsize <<" bytes " <<"[ " <<freesize <<" free]";
}
} while (Heap32ListNext(snapshot, &heap));

}
// printf("\n%s:%d",proc.szExeFile,proc.th32ProcessID);
//printf("\n\tHeap: %lu bytes [%lu free]",heapsize,freesize);

اين براي سمت User هست مي توني به راحتي براي Device Driver ها هم سرچ كني و كدش پيدا كني
خواستي بگو برات بذارم

ICEMAN
پنج شنبه 20 تیر 1387, 20:27 عصر
من درست سوال و متوجه نشدم به همين خاطر جواب قبلي ....
مي توني از ZwQuerySystemInformation استفاده كني

hoax3r
جمعه 21 تیر 1387, 12:11 عصر
ممنون بابت راهنماییتون، ولی متاسفانه با این api هم به نتیجه نرسیدم
با تشکر