Код (ASM): ; GUI # include win64a.inc .code WinMain proc local Message:UNICODE_STRING local Result:qword mov rax,qword ptr gs:[60h];Получаем адрес PEB mov rax,[rax+18h];Смещаемся к структуре PEB_LDR_DATA mov rax,[rax+20h];Смещаемся к полю PEB_LDR_DATA.InMemoryOrderModuleList mov rax,[rax] mov rbx,[rax+20h];Базовый адрес ntdll.dll cmp word ptr[rbx].IMAGE_DOS_HEADER.e_magic,IMAGE_DOS_SIGNATURE jne exit_ mov r9d,[rbx].IMAGE_DOS_HEADER.e_lfanew;смещение до PE-заголовка cmp word ptr[rbx+r9],IMAGE_NT_SIGNATURE; jne exit_ ;18h to optional header + 70h to data directories mov r9d,dword ptr[rbx+r9+18h].IMAGE_OPTIONAL_HEADER64.DataDirectory;смещение до секции экспорта ;Пеpейти к таблице экспоpта и получить количество имен (NumberOfNames) add r9,rbx;переходим в таблицу экспорта mov r14d,[r9].IMAGE_EXPORT_DIRECTORY.NumberOfNames;[r9+18h] mov r13d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfNames;[r9+20h] add r13,rbx mov edx,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfFunctions;[r9+1Ch] lea r12,[rbx+rdx+4];tableOfAddressOfFunctions ;--------------------------------------------------- invoke func,sizeof aLdrLoadDll,&aLdrLoadDll mov Message.woLength,14h mov Message.MaximumLength,16h movr qword ptr Message.Buffer,aUser32_ lea r8,Message mov ecx,1 lea edx,Result mov r9,rdx call rax;LdrLoadDll_ ;--------------------------------------- lea r15,aMessageBoxA mov Message.woLength,12 mov Message.MaximumLength,13 mov Message.Buffer,r15;&aMessageBoxA ;---------------------------------------------------- invoke func,sizeof aLdrGetProcedureAddress,&aLdrGetProcedureAddress xor r8,r8 lea rdx,Message mov [rsp+28h],r15;&aMessageBoxA lea r9,Result mov rcx,[r9] and dword ptr[rsp+20h],0 call rax;LdrGetProcedureAddress_ ;----------------------------------- mov r9d,MB_OK lea r8d,aTitle mov edx,offset aMessage xor ecx,ecx call Result exit_: invoke RtlExitUserProcess,NULL WinMain endp func proc sizeof1:dword,NameProc:dword mov sizeof1,ecx mov NameProc,edx xor edx,edx mov r8,r13 @@: mov edi,[r8] add rdi,rbx mov ecx,sizeof1;sizeof aLdrGetProcedureAddress mov esi,NameProc;offset aLdrGetProcedureAddress repe cmpsb or ecx,ecx je @f add r8,4 add edx,4 dec r14d;NumberOfNames jnz @b @@: mov eax,[r12+rdx] add rax,rbx leave ret func endp ;.data--------------------------------------- aLdrLoadDll db "LdrLoadDll",0 aUser32_ dw 'u','s','e','r','3','2','.','d','l','l',0 aLdrGetProcedureAddress db "LdrGetProcedureAddress",0 aTitle db "MessageBox without import",0 aMessage db "Hello, world!",0 aMessageBoxA db "MessageBoxA",0 end во вложении asm/exe-файл
у меня нет масма - я просто запустил твой экзешник из архива. --- Сообщение объединено, 5 фев 2025 --- вот лог отладчика: Код (Text): 0:000> bp @$exentry *** WARNING: Unable to verify checksum for image00000000`00400000 0:000> bl 0 e 00000000`00400200 0001 (0001) 0:**** image00000000_00400000+0x200 0:000> g Breakpoint 0 hit image00000000_00400000+0x200: 00000000`00400200 c8500000 enter 50h,0 0:000> g (450.b94): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. ntdll!LdrpApplyFileNameRedirection+0x37: 00000000`76eaea37 66833a08 cmp word ptr [rdx],8 ds:00000000`00000000=????
Marylin, откуда-то из глубины LdrpApplyFileNameRedirection я ее не использовал, у меня Windows 10 Pro, всё нормально, а если по шагам, откуда exception?
судя по стеку вызовов или LdrLoadDll(), или LdrGetProcedureAddress() Код (Text): 0:000> kv n # Child-SP RetAddr : Args to Child : Call Site 00 00000000`0013fc50 00000000`76eb4f91 : 00000000`00000000 00000000`00000000 00000000`76e873c0 00000000`00000000 : ntdll!LdrpApplyFileNameRedirection+0x37 01 00000000`0013fcf0 00000000`76eb7acc : 00000000`76e80000 00000000`00000000 00000000`00400361 00000000`00000000 : ntdll!LdrGetDllHandleEx+0x101 02 00000000`0013fec0 00000000`004002d4 : 00000000`00000017 00000000`0040034a 00000000`00000000 00000000`00000000 : ntdll!LdrGetDllHandle+0x1c 03 00000000`0013ff00 00000000`00000017 : 00000000`0040034a 00000000`00000000 00000000`00000000 00000000`00000000 : image00000000_00400000+0x2d4 04 00000000`0013ff08 00000000`0040034a : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00400389 : 0x17 05 00000000`0013ff10 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00400389 00000000`00000000 : image00000000_00400000+0x34a --- Сообщение объединено, 5 фев 2025 --- а в x64dbg падает сразу на старте, не успев даже сделать первый вздох:
последняя процедура в стеке вызовов и у alex_dz и у Marylin LdrpApplyFileNameRedirection и потом ошибка чтения по нулевому адресу
Mikl___, у вас проблема с поиском адреса экспортируемой функции. Вот кусок документации от MS: А у вас по факту: Код (Text): i = Search_ExportNamePointerTable (ExportName); SymbolRVA = ExportAddressTable [i - OrdinalBase]; Вероятно, на Win10 из-за особенностей DLL оба алгоритма дают одинаковый результат. А на Win7/Win8 есть несколько функций с ординалами без имён, они ломают поиск. Ещё момент. Ваша программа без релоков, ImageBase вписывается в Dword, поэтому здесь Код (Text): mov NameProc,edx . . . mov esi,NameProc проблем не возникает. Но вообще-то нужны 64-битные регистры.
Раскрутка стека показывает, что до адреса 0x004002d4 всё шло нормально, а дальше проц зашёл в call Result, в нёдрах которого и наткнулся на "NULL_POINTER_READ". если посмотреть в IDA, то получим сл.картину: Код (Text): 0:000> g (f4.bcc): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. ntdll!LdrpApplyFileNameRedirection+0x37: 00000000`76fcea37 66833a08 cmp word ptr [rdx],8 ds:00000000`00000000=???? 0:000> !analyze -v ******************************************************************************* * Exception Analysis * ******************************************************************************* FAULTING_IP: ntdll!LdrpApplyFileNameRedirection+37 00000000`76fcea37 66833a08 cmp word ptr [rdx],8 EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000076fcea37 (ntdll!LdrpApplyFileNameRedirection+0x37) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0] : 0000000000000000 Parameter[1] : 0000000000000000 Attempt to read from address 0000000000000000 FOLLOWUP_IP: image00000000_00400000+2d4 00000000`004002d4 41b900000000 mov r9d,0 <----------------------// NTGLOBALFLAG : 470 APP_VERIFIER_FLAGS : 0 PRIMARY_PROBLEM_CLASS: NULL_POINTER_READ LAST_CONTROL_TRANSFER: from 0000000076fd4f91 to 0000000076fcea37 STACK_TEXT: 00000000`0013fc50 00000000`76fd4f91 : ntdll!LdrpApplyFileNameRedirection+0x37 00000000`0013fcf0 00000000`76fd7acc : ntdll!LdrGetDllHandleEx+0x101 00000000`0013fec0 00000000`004002d4 : ntdll!LdrGetDllHandle+0x1c 00000000`0013ff00 00000000`00000017 : image00000000_00400000+0x2d4 <---------------------// 00000000`0013ff08 00000000`0040034a : 0x17 00000000`0013ff10 00000000`00000000 : image00000000_00400000+0x34a SYMBOL_STACK_INDEX : 3 SYMBOL_NAME : image00000000_00400000+2d4 FOLLOWUP_NAME : MachineOwner IMAGE_NAME : F:\tut_01c.exe DEBUG_FLR_TIMESTAMP: 67a33d2f STACK_COMMAND : ~0s ; kb BUCKET_ID : X64_APPLICATION_FAULT_NULL_POINTER_READ_image00000000_00400000+2d4 --------------------------
Советую использовать LdrGetProcedureAddressForCaller так как именно эта функция обрабатывается в ntdll.dll А LdrGetProcedureAddress и LdrGetProcedureAddressEx просто лишние стабы
Код (ASM): ; GUI # include win64a.inc .code WinMain proc local Message:UNICODE_STRING local Result:qword mov rax,qword ptr gs:[60h];Получаем адрес PEB mov rax,[rax+18h];Смещаемся к структуре PEB_LDR_DATA mov rax,[rax+20h];Смещаемся к полю PEB_LDR_DATA.InMemoryOrderModuleList mov rax,[rax] mov rbx,[rax+20h];Базовый адрес ntdll.dll mov r9d,[rbx].IMAGE_DOS_HEADER.e_lfanew;смещение до PE-заголовка ;18h to optional header + 70h to data directories mov r9d,dword ptr[rbx+r9+18h].IMAGE_OPTIONAL_HEADER64.DataDirectory;смещение до секции экспорта ;Пеpейти к таблице экспоpта и получить количество имен (NumberOfNames) add r9,rbx;переходим в таблицу экспорта mov r13d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfNames;[r9+20h] add r13,rbx; mov r15d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals;AddressOfNameOrdinals (rva) add r15,rbx;add dll base address ExportOrdinalTable mov r12d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfFunctions;[r9+1Ch] add r12,rbx;tableOfAddressOfFunctions ;--------------------------------------------------- mov ecx,11 invoke func,,"LdrLoadDll" mov Message.woLength,14h mov Message.MaximumLength,16h movr qword ptr Message.Buffer,aUser32_ lea r8,Message mov ecx,1 lea edx,Result mov r9,rdx call rax;LdrLoadDll_ ;--------------------------------------- mov Message.woLength,12 mov Message.MaximumLength,13 movr qword ptr Message.Buffer,aMessageBoxA ;---------------------------------------------------- mov ecx,20 invoke func,,"LdrGetProcedureAddressForCaller" xor r8,r8 lea rdx,Message movr qword ptr[rsp+28h],aMessageBoxA lea r9,Result mov rcx,[r9] and dword ptr[rsp+20h],0 call rax;LdrGetProcedureAddress_ ;----------------------------------- invoke Result,0,"Hello, world!","MessageBox without import",MB_OK mov ecx,19 invoke func,,"RtlExitUserProcess" xor ecx,ecx call rax;RtlExitUserProcess WinMain endp ;i = Search_ExportNamePointerTable(ExportName) ;ordinal = ExportOrdinalTable[i] ;SymbolRVA = ExportAddressTable [ordinal - OrdinalBase]; func proc sizeof1:dword,NameProc:qword mov sizeof1,ecx mov NameProc,rdx xor edx,edx @@: mov edi,[r13+rdx*4];AddressOfNames[rdx*4] add rdi,rbx mov rcx,sizeof1; mov rsi,NameProc; repe cmpsb or ecx,ecx je @f inc edx jnz @b @@: movzx edx,word ptr[r15+rdx*2];get ordinal value from array of words ordinal = ExportOrdinalTable[rdx*2] mov eax,[r12+rdx*4];r12=AddressOfFunctions add rax,rbx leave ret func endp ;--------------------------------------- aUser32_ dw "u","s","e","r","3","2",".","d","l","l",0 aMessageBoxA db "MessageBoxA",0 end во вложении asm/exe-файл
Mikl___, всё равно на моей Win7 не работает, только на этот раз падает на входе в LdrLoadDll(), и выстреливает такое-же окно с ошибкой: Код (Text): 0:000> g (b3c.b50): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. ntdll!LdrLoadDll+0x97: 00000000`77d5a3c7 488b7308 mov rsi,qword ptr [rbx+8] ds:00000000`00000008=???????????????? 0:000> !analyze -v ******************************************************************************* * Exception Analysis * ******************************************************************************* FAULTING_IP: ntdll!LdrLoadDll+97 00000000`77d5a3c7 488b7308 mov rsi,qword ptr [rbx+8] EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000077d5a3c7 (ntdll!LdrLoadDll+0x0000000000000097) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 0000000000000000 Parameter[1]: 0000000000000008 Attempt to read from address 0000000000000008 FOLLOWUP_IP: image00000000_00400000+259 00000000`00400259 66c745f00c00 mov word ptr [rbp-10h],0Ch NTGLOBALFLAG : 470 APP_VERIFIER_FLAGS: 0 BUGCHECK_STR : APP_FAULT_NULL_CLASS_PTR_DEREFERENCE_ONE_BIT_INVALID_POINTER_READ PROBLEM_CLASS : NULL_CLASS_PTR_DEREFERENCE_ONE_BIT BUCKET_ID : NULL_CLASS_PTR_DEREFERENCE_ONE_BIT LAST_CONTROL_TRANSFER: from 0000000000400259 to 0000000077d5a3c7 STACK_TEXT: 00000000`0013fe90 00000000`00400259 : ntdll!LdrLoadDll+0x97 00000000`0013ff00 00000000`0000000b : image00000000_00400000+0x259 00000000`0013ff08 00000000`77c70000 : 0xb 00000000`0013ff10 00000000`0013ff50 : ntdll!NtDllUserStubs <PERF> (ntdll+0x0) 00000000`0013ff18 00000000`0040030f : 0x13ff50 00000000`0013ff20 00000000`00000000 : image00000000_00400000+0x30f ---------------------------------------
Marylin, ну, хоть какой-то прогресс , проблему описал Prober, проблема с поиском адреса экспортируемой функции ... на Win7/Win8 есть несколько функций с ординалами без имён, они ломают поиск я не помню, где-то у тебя в статьях на codeby.net был описан процесс поиска функций в экспорте, не можешь подсказать где? Prober и k3rnl, отдельное спасибо, кое-что я исправил, но судя по всему не до конца Попробуйте с новым ехе-шником
'tut_01d.exe.4940.dmp' (Minidump): Loaded 'C:\Windows\System32\ntdll.dll'. Symbols loaded. 'tut_01d.exe.4940.dmp' (Minidump): Loaded 'C:\Windows\System32\kernel32.dll'. Symbols loaded. 'tut_01d.exe.4940.dmp' (Minidump): Loaded 'C:\Windows\System32\KERNELBASE.dll'. Symbols loaded. Unhandled exception at 0x0000000076E5A3C7 (ntdll.dll) in tut_01d.exe.4940.dmp: 0xC0000005: Access violation reading location 0x0000000000000008. https://prnt.sc/aGSBqeK_8ION