|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Не совсем в тему, но все же. Поиск базы длл по ее имени в адресном пространстве другого процесса (аналог GetModuleHandle, но для др. адресного пространства).
Может, кому понадобится. Писал я по просьбе протеуса ну и соотв. там мои норкоманские идеи 
Итак, че же для этого я сделал.
Ищем первый поток процесса. С помощью GetThreadSelectorEntry получаем запись LDT по селектору FS = 0x3b. Открываем Thread Environment Block, из него Process Environment Block, из него - структуру данных загрузчика (все это через ReadProcessMemory), потом проходимся по списку модулей.
Код:
const DWORD FS = 0x3B;
DWORD ownerProcessId = 38056;
// Open process
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ownerProcessId);
if(!hProcess)
return printf("Cannot open process\n");
// Find thread
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
THREADENTRY32 te = {sizeof(te)};
Thread32First(hSnapshot, &te);
DWORD threadId = 0;
do
{
if(te.th32OwnerProcessID == ownerProcessId)
threadId = te.th32ThreadID;
}
while(Thread32Next(hSnapshot, &te));
if(!threadId)
return printf("No threads for specified process id\n");
// Get FS base
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, 0, threadId);
if(!hThread)
return printf("Cannot open thread\n");
LDT_ENTRY fs_entry;
GetThreadSelectorEntry(hThread, FS, &fs_entry);
DWORD fs_base = fs_entry.BaseLow | (fs_entry.HighWord.Bytes.BaseMid<<16) | (fs_entry.HighWord.Bytes.BaseHi<<24);
// Read modules list
TEB teb;
DWORD read;
if(!ReadProcessMemory(hProcess, (LPCVOID) fs_base, &teb, sizeof(teb), &read))
return printf("Can't read process memory for TEB, %d bytes read\n", read);
PEB peb;
if(!ReadProcessMemory(hProcess, (LPCVOID) teb.Peb, &peb, sizeof(peb), &read))
return printf("Can't read process memory for PEB, %d bytes read\n", read);
PEB_LDR_DATA pld;
if(!ReadProcessMemory(hProcess, (LPCVOID) peb.LoaderData, &pld, sizeof(pld), &read))
return printf("Can't read process memory for PEB_LDR_DATA, %d bytes read\n", read);
LDR_MODULE entry;
if(!ReadProcessMemory(hProcess, (LPCVOID) pld.InInitializationOrderModuleList.Flink, &entry, sizeof(entry), &read))
return printf("Can't read process memory for LDR_MODULE, %d bytes read\n", read);
WORD wbuffer[20];
char buffer[1024];
// Walk the list
do
{
// Print the name
if(!ReadProcessMemory(hProcess, (LPCVOID) entry.BaseDllName.Buffer, &wbuffer, sizeof(wbuffer), &read))
return printf("Can't read process memory for wbuffer in loop, %d bytes read\n", read);
WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, buffer, sizeof(buffer), 0, 0);
printf("%s\t[0x%08x]\n", buffer, entry.BaseAddress);
// Next
if(!ReadProcessMemory(hProcess, (LPCVOID) entry.ModuleList.Flink, &entry, sizeof(entry), &read))
return printf("Can't read process memory for LDR_MODULE in loop, %d bytes read\n", read);
}
while(entry.ModuleList.Flink != pld.InInitializationOrderModuleList.Flink);
CloseHandle(hThread);
CloseHandle(hProcess);
CloseHandle(hSnapshot);
|