Я тут немножко при*уел. В общем, kernel32.dll: Код (Text): .text:77E2B6BF ; HMODULE __stdcall LoadLibraryExW(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags) .text:77E2B6BF public LoadLibraryExW .text:77E2B6BF LoadLibraryExW proc near .text:77E2B6BF .text:77E2B6BF lpLibFileName = dword ptr 8 .text:77E2B6BF hFile = dword ptr 0Ch .text:77E2B6BF dwFlags = dword ptr 10h .text:77E2B6BF .text:77E2B6BF mov edi, edi .text:77E2B6C1 push ebp .text:77E2B6C2 mov ebp, esp .text:77E2B6C4 pop ebp .text:77E2B6C5 jmp loc_77E317AE .text:77E2B6C5 LoadLibraryExW endp jmp loc_77E317AE Код (Text): .text:77E317AE ; --------------------------------------------------------------------------- .text:77E317AE .text:77E317AE loc_77E317AE: ; CODE XREF: LoadLibraryExW+6j .text:77E317AE ; LoadLibraryW+Cp ... .text:77E317AE jmp ds:LoadLibraryExW_0 jmp ds:LoadLibraryExW_0 Код (Text): .idata:77DE1B04 ; .idata:77DE1B04 ; Imports from API-MS-Win-Core-LibraryLoader-L1-1-0.dll .idata:77DE1B04 ; ... .idata:77DE1B44 ; HMODULE __stdcall LoadLibraryExW_0(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags) .idata:77DE1B44 extrn LoadLibraryExW_0:dword .idata:77DE1B44 ; DATA XREF: .text:loc_77E317AEr Окей, импортируется функция из API-MS-Win-Core-LibraryLoader-L1-1-0.dll. Вот, она даже в экспорте этой либы есть: Далее: Код (Text): .text:08C0107E ; Exported entry 7. GetModuleFileNameA .text:08C0107E ; Exported entry 8. GetModuleFileNameW .text:08C0107E ; Exported entry 10. GetModuleHandleExA .text:08C0107E ; Exported entry 11. GetModuleHandleExW .text:08C0107E ; Exported entry 14. LoadLibraryExA .text:08C0107E ; Exported entry 15. LoadLibraryExW .text:08C0107E .text:08C0107E ; --------------- S U B R O U T I N E --------------------------------------- .text:08C0107E .text:08C0107E .text:08C0107E ; HMODULE __stdcall LoadLibraryExA(LPCSTR lpLibFileName,HANDLE hFile,DWORD dwFlags) .text:08C0107E public LoadLibraryExA .text:08C0107E LoadLibraryExA proc near .text:08C0107E .text:08C0107E lpLibFileName = dword ptr 4 .text:08C0107E hFile = dword ptr 8 .text:08C0107E dwFlags = dword ptr 0Ch .text:08C0107E .text:08C0107E xor eax, eax ; GetModuleFileNameA .text:08C0107E ; GetModuleFileNameW .text:08C0107E ; GetModuleHandleExA .text:08C0107E ; GetModuleHandleExW .text:08C0107E ; LoadLibraryExA .text:08C01080 retn 0Ch .text:08C01080 LoadLibraryExA endp .text:08C01080 .text:08C01080 ; --------------------------------------------------------------------------- xor eax, eax ??? Windows Seven 7600 IDA 4.90 FREE Что за ? o0
Оу. LoadLibraryA в общем, рулит. Хм. Странно. Код (Text): .text:77E32864 ; HMODULE __stdcall LoadLibraryA(LPCSTR lpLibFileName) .text:77E32864 public LoadLibraryA .text:77E32864 LoadLibraryA proc near ; CODE XREF: SetThreadExecutionState+5A0Ap .text:77E32864 ; sub_77E38013+1947Fp .text:77E32864 .text:77E32864 lpLibFileName = dword ptr 8 .text:77E32864 .text:77E32864 mov edi, edi .text:77E32866 push ebp .text:77E32867 mov ebp, esp .text:77E32869 cmp [ebp+lpLibFileName], 0 .text:77E3286D push ebx .text:77E3286E push esi .text:77E3286F push edi .text:77E32870 jz short loc_77E3288A .text:77E32872 push offset aTwain_32_dll ; "twain_32.dll" .text:77E32877 push [ebp+lpLibFileName] ; char * .text:77E3287A call ds:_strcmpi .text:77E32880 pop ecx .text:77E32881 pop ecx .text:77E32882 test eax, eax .text:77E32884 jz loc_77E4F39F .text:77E3288A .text:77E3288A loc_77E3288A: ; CODE XREF: LoadLibraryA+Cj .text:77E3288A ; SetThreadExecutionState+59E0j ... .text:77E3288A push 0 ; dwFlags .text:77E3288C push 0 ; hFile .text:77E3288E push [ebp+lpLibFileName] ; lpLibFileName .text:77E32891 call LoadLibraryExA_0 .text:77E32896 .text:77E32896 loc_77E32896: ; CODE XREF: SetThreadExecutionState+5A2Cj .text:77E32896 pop edi .text:77E32897 pop esi .text:77E32898 pop ebx .text:77E32899 pop ebp .text:77E3289A retn 4 .text:77E3289A LoadLibraryA endp .text:77E3289A .text:77E328B2 .text:77E4F39F loc_77E4F39F: ; CODE XREF: LoadLibraryA+20j .text:77E4F39F call KernelBaseGetGlobalData .text:77E4F3A4 mov eax, [eax+2Ch] .text:77E4F3A7 mov ecx, large fs:18h .text:77E4F3AE mov esi, 104h .text:77E4F3B3 push esi .text:77E4F3B4 push eax .text:77E4F3B5 mov eax, [ecx+30h] .text:77E4F3B8 push dword ptr [eax+18h] .text:77E4F3BB call ds:__imp_RtlAllocateHeap .text:77E4F3C1 mov edi, eax .text:77E4F3C3 test edi, edi .text:77E4F3C5 jz loc_77E3288A .text:77E4F3CB lea ebx, [esi-0Dh] .text:77E4F3CE push ebx .text:77E4F3CF push edi .text:77E4F3D0 call loc_77E1A71F .text:77E4F3D5 test eax, eax .text:77E4F3D7 jz short loc_77E4F416 .text:77E4F3D9 cmp eax, ebx .text:77E4F3DB jnb short loc_77E4F416 .text:77E4F3DD push 0Dh .text:77E4F3DF push offset unk_77E4F430 .text:77E4F3E4 push esi .text:77E4F3E5 push edi .text:77E4F3E6 call strncat_s .text:77E4F3EB add esp, 10h .text:77E4F3EE push edi ; lpLibFileName .text:77E4F3EF call LoadLibraryA .text:77E4F3F4 mov esi, eax .text:77E4F3F6 test esi, esi .text:77E4F3F8 jz short loc_77E4F416 .text:77E4F3FA mov eax, large fs:18h .text:77E4F400 mov eax, [eax+30h] .text:77E4F403 push edi .text:77E4F404 push 0 .text:77E4F406 push dword ptr [eax+18h] .text:77E4F409 call ds:__imp_RtlFreeHeap .text:77E4F40F mov eax, esi .text:77E4F411 jmp loc_77E32896 .text:77E4F416 ; --------------------------------------------------------------------------- .text:77E4F416
Хм. Впринципе, мне же всего лишь надо получить дескритор ntdll.dll, которая уже загружена в память процесса (чтобы сделать анхук NtProtectVirtualMemory). Тут есть такая функция для получения хэндла на kernel32.dll: Код (Text): inline HMODULE GK() { __asm { mov eax, dword ptr fs:[30h] mov eax, dword ptr [eax+0ch] mov esi, dword ptr [eax+1ch] lodsd mov eax, dword ptr [eax+08h] } } Как её переписать, чтобы получить хэндл на ntdll.dll ?
В общем, тут полюбому нужно иметь базу ntdll.dll, ибо надо получить адрес на функцию LdrGetProcedureAddress(), ну, чтобы и на др. функции из ntdll адреса получать, т.к. в ntdll.lib, что взята из wdk не все функции доступны для имопрта. Вот, кстати, попроще способ получить базу ntdll.dll (тот, что в поиске был найден ... громоздкий какой-то): Код (Text): //- Getting kenel32.dll image base - //;----------------------------------------------------------------------------- // mov eax, dword ptr fs:[30h] ; PEB base in eax // mov eax, dword ptr [eax+0ch] ; goto PEB_LDR_DATA // // mov esi, dword ptr [eax+1ch] ; get the first entry in the // ; InitOrderModuleList // ; now the esi points to the LIST_ENTRY entry which also contains // ; (besides others) the image base of ntdll.dll // ; *esi // ; dd *forwards_in_the_list ; esi+0 // ; dd *backwards_in_the_list ; +4 // ; dd imagebase_of_ntdll.dll ; +8 // ; ... // ; dd imagetimestamp ; +44h // // // lodsd ; we go forwards // mov ebx, dword ptr [eax+08h] ; and finally we get the image base // ; of kernel32.dll //;----------------------------------------------------------------------------- inline HMODULE GetNtdllBase() { __asm { mov eax, dword ptr fs:[30h] mov eax, dword ptr [eax+0ch] ; kernel32.dll ;mov esi, dword ptr [eax+1ch] ;lodsd ; ntdll.dll mov eax, dword ptr [eax+1ch] mov eax, dword ptr [eax+08h] } }
Чёто я гоню. Адреса на функции из ntdll.dll нужно через ручной парсинг таблицы экспорта получать. Просто тут жизненно необходимо было получить её базу. ВЕРНИТЕ РЕДАКТИРОВАНИЕ!
ну да) ты это вроде выше писал? или это уже просьба? https://www.wasm.ru/forum/viewtopic.php?pid=346677#p346677