Показать сообщение отдельно

  #8  
Старый 05.01.2007, 12:55
_Great_
Флудер
Регистрация: 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);
 
Ответить с цитированием