#windows #dll
Есть 32 битный процесс в 64 битной системе. Пытаюсь получить список DLL через: 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 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 C:\Windows\SysWOW64\kernel.appcore.dll C:\Windows\SysWOW64\kernel32.dll C:\Windows\SysWOW64\KernelBase.dll C:\Windows\System32\locale.nls C:\Windows\SysWOW64\msctf.dll C:\Users\1\Desktop\msvcr100.dll C:\Windows\SysWOW64\msvcrt.dll C:\Windows\SysWOW64\ntdll.dll C:\Windows\System32\ntdll.dll C:\Windows\SysWOW64\rpcrt4.dll C:\Windows\SysWOW64\sechost.dll C:\Windows\SysWOW64\SHCore.dll C:\Windows\Globalization\Sorting\SortDefault.nls C:\Windows\SysWOW64\sspicli.dll C:\Windows\Fonts\StaticCache.dat C:\Users\1\Desktop\test.exe C:\Windows\SysWOW64\user32.dll C:\Windows\SysWOW64\ru-RU\user32.dll.mui C:\Windows\SysWOW64\uxtheme.dll C:\Windows\System32\wow64.dll C:\Windows\System32\wow64cpu.dll C:\Windows\System32\wow64win.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)); } } } } }
Ответы
Ответ 1
Почему в 1 случае "C:\Windows\SYSTEM32\", а не C:\Windows\SysWOW64. Запрашивается ведь из 32 битного(WOW64) процесса для себя же. Именно потому что запрашивается из 32-х битного процесса. Wow64 использует перенаправление реестра и файловой системы для того чтобы все 32-х битные приложения нормально запускались на 64-х битных системах, если в них вдруг жёстко прописаны системные пути. Если вы хотите получить реальные пути файлов на 64-х битной системе, то надо либо использовать 64-х битное приложение либо искать пути обхода виртуализации (если они вообще существуют).
Комментариев нет:
Отправить комментарий