Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

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

#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-х битное приложение либо искать пути обхода виртуализации (если они вообще существуют).

Комментариев нет:

Отправить комментарий