Хочу сделать копию ntdll в процессе. Но почему то не могу найти нужные экспортируемые функ. Функция ImageProcAddr ищет адресс экспортируемой функ. Проблема в том что если образ грузить вручную то там заголовок отличаеться от того который в GetModuleHandle("NTDLL"); И тем самым ImageProcAddr работает не правильно.... ОС XP sp 2 x64, ativirus COMODO. Код (Text): typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); BOOL IsWow64() { LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL bIsWow64 = FALSE; fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if (NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { // handle error } } return bIsWow64; }; .... HANDLE hNtdll; WCHAR lpNtdll[MAX_PATH]; GetWindowsDirectory(lpNtdll,sizeof(lpNtdll)); wcscat(lpNtdll,(IsWow64())?(L"\\syswow64\\ntdll.dll"):(L"\\system32\\ntdll.dll")); hNtdll = CreateFile(lpNtdll,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if (hNtdll == INVALID_HANDLE_VALUE) return; DWORD s; s=GetFileSize(hNtdll,NULL); CopyNtdll = VirtualAlloc(0,s,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); ReadFile(hNtdll,CopyNtdll,s,&s,NULL); CloseHandle(hNtdll); ImageProcAddr(CopyNtdll,"ZwCreateProcessEx"); .... PVOID ImageProcAddr(PVOID ImageBase,PCHAR name){ // !!! (Export Forwarding) PIMAGE_NT_HEADERS pNT ; PIMAGE_EXPORT_DIRECTORY pExport; PULONG_PTR pExportNames; PWORD pOrd ; PULONG_PTR AddressFunctions; ULONG i; PCHAR pch; pNT = (PIMAGE_NT_HEADERS)((ULONG_PTR)ImageBase + ((PIMAGE_DOS_HEADER) ImageBase)->e_lfanew); pExport = (PIMAGE_EXPORT_DIRECTORY)( (LONG)ImageBase + (ULONG_PTR)pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress ); pExportNames =(PULONG_PTR) (pExport->AddressOfNames + (ULONG_PTR)ImageBase); pOrd = (PWORD)(pExport->AddressOfNameOrdinals + (ULONG_PTR)ImageBase); AddressFunctions = (PULONG_PTR)(pExport->AddressOfFunctions + (ULONG_PTR)ImageBase); for ( i = 0; i<(ULONG_PTR)pExport->NumberOfNames; i++){ pch =(PCHAR) (pExportNames[i] + (ULONG_PTR)ImageBase) ; if (! strcmp(name,pch) ) { return (PVOID)( (ULONG_PTR)AddressFunctions[pOrd[i]] + (ULONG_PTR)ImageBase ); }; }; return NULL; };
Так PE формат для 64 разве не отличается от 32 ? А у тебя ImageProcAddr одна для обоих. С адресами ничего не напутал? В 32 битном процессе может быть две ntdll, если она есть у кого-то в импорте насколько я понял. Тебе какая нужна? Кароче ниче сложного, в отладчике посмотри=)
что за бред? PE-файл вообще-то должен быть загружен с учетом выравнивания... и все смещения, что указаны в таблице экспорта (да и во всех таблицах PE-формата), указаны с учетом выравнивания...