Задать вопрос
@alexr10

Список DLL в x64 Windows для wow64?

Есть 32 битный процесс в 64 битной системе. Пытаюсь получить список DLL через:
  1. PEB и Module32Next
    C:\Windows\SYSTEM32\ntdll.dll
    C:\Windows\SYSTEM32\kernel32.dll
    C:\Windows\SYSTEM32\kernelbase.dll
    C:\Windows\SYSTEM32\user32.dll
    C:\Windows\SYSTEM32\gdi32.dll
    C:\Windows\SYSTEM32\msvcr100.dll
    C:\Windows\SYSTEM32\imm32.dll

  2. Process Explorer
    C:\Windows\SysWOW64\bcryptprimitives.dll
    C:\Windows\SysWOW64\combase.dll
    C:\Windows\SysWOW64\cryptbase.dll
    C:\Windows\SysWOW64\dwmapi.dll
    C:\Windows\SysWOW64\gdi32.dll
    C:\Windows\SysWOW64\imm32.dll



Почему в 1 случае "C:\Windows\SYSTEM32\", а не C:\Windows\SysWOW64\
Запрашивается ведь из 32 битного(WOW64) процесса для себя же.

HANDLE h;
PEB p;
PROCESS_BASIC_INFORMATION s;
DWORD w=0;
HMODULE hMsi;
PLDR_MODULE curr;
PLDR_MODULE b;
DWORD adr;
BYTE *bfv;
long sz;
DWORD r;
HANDLE hf;
MODULEENTRY32 pf;


hMsi=LoadLibrary("ntdll.dll");
NtQueryInformationProcess=(NtQueryInformationProcessQ)GetProcAddress(hMsi,"NtQueryInformationProcess");


h=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessId());
ZeroMemory(&pf,sizeof(pf));
pf.dwSize=sizeof(pf);
Module32First(h,&pf);
for(;;)
{
	ZeroMemory(&pf,sizeof(pf));
	pf.dwSize=sizeof(pf);
	w=Module32Next(h,&pf);
	printf("%s \n",pf.szExePath);
	if( w==0 ) break;
}

MessageBox(0,0,0,1);


ZeroMemory(&s,sizeof(s));
h=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,0,GetCurrentProcessId());
if( h>0 )
{
	if( NtQueryInformationProcess(h,ProcessBasicInformation,&s,sizeof(s),&w)==0 )
	{
		// if( GetProcAddress(LoadLibrary("kernel32.dll"),"IsWow64Process")==0 )
		// {
			ZeroMemory(&p,sizeof(p));
			ReadProcessMemory(h,s.PebBaseAddress,&p,sizeof(p),&w);
			if( w>0 )
			{
				curr=(PLDR_MODULE)p.Ldr->InMemoryOrderModuleList.Flink;
				curr=(PLDR_MODULE)((DWORD)curr-sizeof(LIST_ENTRY));
				b=(PLDR_MODULE)&p.Ldr->InMemoryOrderModuleList;
				b=(PLDR_MODULE)((DWORD)b-sizeof(LIST_ENTRY));

				while(curr!=b)
				{
					printf("%p \n",curr);
					wprintf(L"%s \n",curr->FullDllName.Buffer);
					printf(" \n");

					curr=(PLDR_MODULE)curr->InMemoryOrderModuleList.Flink;
					curr=(PLDR_MODULE)((DWORD)curr-sizeof(LIST_ENTRY));
				}
			}
		}
	}
}
  • Вопрос задан
  • 728 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Frankenstine
@Frankenstine
Сисадмин
Если с английским дружите, то возможно здесь найдётся нужная вам инфа:
https://www.sepago.com/blog/2008/04/20/windows-x64...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы