Доброго времени суток. собственно вопрос: каким образом возможно получить ImageBase запущенного процесса если заранее известен его ProcessID? Благодарю за внимание
fsd спасибо большое. както не подумал про это. смотрел в сторону Native. а как будет нативными ф-циями реализовать сабж, никто не в курсе?
посмотреть в IDA Pro какой тип информации запрашивается функциями CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32)/Module32First у NtQuerySystemInformation
логично. по модулям NtQuerySystemInformation(5), по базе NtQuerySystemInformation(11). а как это все связать вместе - ума не приложу) сорри за тупость. с 4 утра по мск пишу. наткнулся в одном месте на грабли - бегом на форум. может кто сталкивался и подпнёт в правильном направлении))
GeNeZiS Помимо NtQuerySystemInformation примерно так Код (Text): DWORD dwProcessId = NtGetProcessID(L"explorer.exe"); PDEBUG_BUFFER pDebugBuffer = RtlCreateQueryDebugBuffer(NULL, NULL); RtlQueryProcessDebugInformation(dwProcessId,PDI_MODULES, (PDEBUG_BUFFER)pDebugBuffer); PVOID pModBase = NULL; for(int i = 0; i < pDebugBuffer->ModuleInformation->Count; i++) { pModBase = (PVOID)pDebugBuffer->ModuleInformation->aSH[i].Base; char *szModuleName = pDebugBuffer->ModuleInformation->aSH[i].ImageName + pDebugBuffer->ModuleInformation->aSH[i].ModuleNameOffset ; if ( lstrcmpA("calc.exe",szModuleName) == 0 ) break; } HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE,dwProcessId); IMAGE_DOS_HEADER pDosh = {0}; ReadProcessMemory(hProcess,pModBase,&pDosh,sizeof(IMAGE_DOS_HEADER),NULL); CloseHandle(hProcess); RtlDestroyQueryDebugBuffer(pDebugBuffer);
ну и структуры на всякий случай Код (Text): typedef struct _DEBUG_MODULE { ULONG Reserved[2]; ULONG Base; ULONG Size; ULONG Flags; USHORT Index; USHORT Unknown; USHORT LoadCount; USHORT ModuleNameOffset; CHAR ImageName[256]; } DEBUG_MODULE,*PDEBUG_MODULE; typedef struct _DEBUG_MODULE_INFORMATION { ULONG Count; DEBUG_MODULE aSH[]; }DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION; // Debug Functions typedef struct _DEBUG_BUFFER { HANDLE SectionHandle; PVOID SectionBase; PVOID RemoteSectionBase; ULONG SectionBaseDelta; HANDLE EventPairHandle; ULONG Unknown[2]; HANDLE RemoteThreadHandle; ULONG InfoClassMask; ULONG SizeOfInfo; ULONG AllocatedSize; ULONG SectionSize; //PVOID ModuleInformation; PDEBUG_MODULE_INFORMATION ModuleInformation; PVOID BackTraceInformation; PVOID HeapInformation; PVOID LockInformation; PVOID Reserved[8]; } DEBUG_BUFFER, *PDEBUG_BUFFER; #define PDI_MODULES 0x01
Код (Text): call GetCurrentProcessId mov dword ptr ds:[pid], eax push dword ptr ds:[pid] push 0 push PROCESS_ALL_ACCESS Call OpenProcess mov dword ptr ds:[hid], eax push 0 push 24 push offset buff push 0 push eax call ZwQueryInformationProcess mov eax, offset buff mov eax, dword ptr ds:[eax + 4] mov dword ptr ds:[PEB], eax
984259h GetThreadSelectorEntry is only functional on x86-based systems. For systems that are not x86-based, the function returns FALSE.