проблема с чтением ntdll с диска

Тема в разделе "WASM.X64", создана пользователем XshStasX, 5 фев 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Хочу сделать копию ntdll в процессе.
    Но почему то не могу найти нужные экспортируемые функ.
    Функция ImageProcAddr ищет адресс экспортируемой функ.
    Проблема в том что если образ грузить вручную то там заголовок отличаеться от того который в GetModuleHandle("NTDLL");

    И тем самым ImageProcAddr работает не правильно....
    ОС XP sp 2 x64, ativirus COMODO.

    Код (Text):
    1. typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    2.  
    3.  
    4. BOOL IsWow64()
    5. {
    6.     LPFN_ISWOW64PROCESS fnIsWow64Process;
    7.     BOOL bIsWow64 = FALSE;
    8.  
    9.     fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
    10.         GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    11.  
    12.     if (NULL != fnIsWow64Process)
    13.     {
    14.         if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
    15.         {
    16.             // handle error
    17.         }
    18.     }
    19.     return bIsWow64;
    20. };
    21.  
    22. ....
    23.  
    24. HANDLE hNtdll;
    25.     WCHAR lpNtdll[MAX_PATH];
    26.     GetWindowsDirectory(lpNtdll,sizeof(lpNtdll));
    27.     wcscat(lpNtdll,(IsWow64())?(L"\\syswow64\\ntdll.dll"):(L"\\system32\\ntdll.dll"));
    28.     hNtdll = CreateFile(lpNtdll,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    29.  
    30. if (hNtdll == INVALID_HANDLE_VALUE)
    31.         return;
    32.     DWORD s;
    33.     s=GetFileSize(hNtdll,NULL);
    34.     CopyNtdll = VirtualAlloc(0,s,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    35.     ReadFile(hNtdll,CopyNtdll,s,&s,NULL);
    36.     CloseHandle(hNtdll);
    37.  
    38.  
    39. ImageProcAddr(CopyNtdll,"ZwCreateProcessEx");
    40.  
    41. ....
    42.  
    43. PVOID  ImageProcAddr(PVOID ImageBase,PCHAR name){  
    44.  
    45. //      !!! (Export Forwarding)
    46.  
    47.     PIMAGE_NT_HEADERS pNT ;
    48.     PIMAGE_EXPORT_DIRECTORY pExport;
    49.     PULONG_PTR pExportNames;
    50.     PWORD pOrd ;
    51.     PULONG_PTR AddressFunctions;
    52.     ULONG i;
    53.     PCHAR pch;
    54.    
    55.     pNT = (PIMAGE_NT_HEADERS)((ULONG_PTR)ImageBase + ((PIMAGE_DOS_HEADER) ImageBase)->e_lfanew);
    56.  
    57.     pExport  = (PIMAGE_EXPORT_DIRECTORY)( (LONG)ImageBase + (ULONG_PTR)pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress );
    58.  
    59.      pExportNames =(PULONG_PTR) (pExport->AddressOfNames + (ULONG_PTR)ImageBase);
    60.    
    61.      pOrd = (PWORD)(pExport->AddressOfNameOrdinals + (ULONG_PTR)ImageBase);
    62.  
    63.      AddressFunctions = (PULONG_PTR)(pExport->AddressOfFunctions + (ULONG_PTR)ImageBase);
    64.  
    65.     for ( i = 0; i<(ULONG_PTR)pExport->NumberOfNames; i++){
    66.     pch =(PCHAR) (pExportNames[i] + (ULONG_PTR)ImageBase) ;
    67.     if (! strcmp(name,pch) )
    68.     {
    69.          return (PVOID)( (ULONG_PTR)AddressFunctions[pOrd[i]]  + (ULONG_PTR)ImageBase );
    70.     };
    71.     };
    72.     return NULL;
    73. };
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Так PE формат для 64 разве не отличается от 32 ? А у тебя ImageProcAddr одна для обоих. С адресами ничего не напутал?
    В 32 битном процессе может быть две ntdll, если она есть у кого-то в импорте насколько я понял. Тебе какая нужна? Кароче ниче сложного, в отладчике посмотри=)
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    что за бред? PE-файл вообще-то должен быть загружен с учетом выравнивания... и все смещения, что указаны в таблице экспорта (да и во всех таблицах PE-формата), указаны с учетом выравнивания...