Mikl___, не робит - даже адрес крэша остался тот-же LdrLoadDll()+0x97 что-то ты видимо упускаешь из виду, хотя если на Win10 работает, то...
Marylin, можешь запустить dumpbin.exe /EXPORTS %windir%\System32\ntdll.dll /OUT:ntdll.txt и выложить ntdll.txt? dumpbin.exe есть в masm32\bin или в аттаче
Вот лог.. --- Сообщение объединено, 8 фев 2025 --- Mikl___, шелл для поиска функции в экспорте либы: Код (ASM): format pe64 console include 'win64ax.inc' entry start ;//----------- .data struct EXPORT_TABLE Flags dd 0 ;// 00 TimeStamp dd 0 ;// 04 Version dd 0 ;// 08 NameRVA dd 0 ;// 12 имя образа (exe/dll) OrdinalBase dd 0 ;// 16 NumOfFunction dd 0 ;// 20 всего функций NumOfNamePointers dd 0 ;// 24 всего указателей на имена функций AddressTableRVA dd 0 ;// 28 линк на таблицу адресов NamePointersRVA dd 0 ;// 32 линк на таблицу имён OrdinalTableRVA dd 0 ;// 36 линк на таблицу ординалов ends szLoadDll db 'LdrLoadDll',0 szLen = $ - szLoadDll buff db 0 ;//----------- section '.text' code readable executable start: sub rsp,8 ;//----- Ищем в РЕВ базу Ntdll mov rax,[gs:60h] mov rax,[rax+18h] mov rax,[rax+20h] mov rax,[rax] mov rsi,[rax+20h] ;// RSI - Base ;//----- Берём линк на EXPORT_TABLE из PE.DATA_DIRECTORY mov ebx,dword[rsi+0x3c] add rbx,rsi add rbx,136 ;// DATA_DIR.Export mov ebx,dword[rbx] add rbx,rsi ;//----- Раскидываем по регистрам инфу из EXPORT_TABLE mov r10d,dword[rbx+EXPORT_TABLE.AddressTableRVA] ;// R10 = Адрес mov r11d,dword[rbx+EXPORT_TABLE.NamePointersRVA] ;// R11 = Имя mov r12d,dword[rbx+EXPORT_TABLE.OrdinalTableRVA] add r10,rsi add r11,rsi add r12,rsi mov rbx,rsi ;// RBX = Base ;//----- Пропустим безымянные функции (только с ординалом) movzx eax,word[r12] shl eax,2 add r10,rax ;//----- Поиск адреса LdrLoadDll() в экспорте.. @find: mov rdi,szLoadDll mov esi,[r11d] add rsi,rbx mov rcx,szLen repe cmpsb ;// Сравнить строки.. jecxz @ok add r10,4 ;// сл.запись в таблицах add r11,4 add r12,4 jmp @find @ok: mov r10d,dword[r10] mov r11d,dword[r11] add r10,rbx ;// R10 = Address add r11,rbx ;// R11 = Имя cinvoke printf,<10,' Addr: %p Name: %s'>,r10,r11 ;//----- Проверим стд.способом invoke GetModuleHandle,<'ntdll.dll',0> invoke GetProcAddress,rax,<'LdrLoadDll',0> cinvoke printf,<10,' Addr: %p Name: %s'>,rax,szLoadDll @exit: cinvoke _getch cinvoke exit, 0 ;//----------- section '.idata' import data readable library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll' include 'api\msvcrt.inc' include 'api\kernel32.inc'
Код (Text): 0:000> g (97c.700): Access violation - code c0000005 (first chance) image00000000_00400000+0x2f0: 00000000`004002f0 f3a6 repe cmps byte ptr [rsi],byte ptr [rdi] 0:000> !analyze -v ******************************************************************************* * Exception Analysis * ******************************************************************************* FAULTING_IP: image00000000_00400000+2f0 00000000`004002f0 f3a6 repe cmps byte ptr [rsi],byte ptr [rdi] EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 00000000004002f0 (image00000000_00400000+0x00000000000002f0) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 0000000000000000 Parameter[1]: 0000000077c7001a Attempt to read from address 0000000077c7001a FOLLOWUP_IP: image00000000_00400000+2f0 00000000`004002f0 f3a6 repe cmps byte ptr [rsi],byte ptr [rdi] EXCEPTION_DOESNOT_MATCH_CODE: This indicates a hardware error. Instruction at 00000000004002f0 does not read/write to 0000000077c7001a PRIMARY_PROBLEM_CLASS: STRING_DEREFERENCE BUGCHECK_STR : APPLICATION_FAULT_STRING_DEREFERENCE_CODE_ADDRESS_MISMATCH_INVALID_POINTER_READ LAST_CONTROL_TRANSFER: from 0000000000000000 to 00000000004002f0 STACK_TEXT: 00000000`0013fe90 00000000`00000000 : image00000000_00400000+0x2f0 ---------
Нет, будет отладочный вывод - если есть юзер-дебаг порт, сообщения в него, если нет то в кернел. Это обычный отладочный вывод dbgprint(). Меня в большинстве случаев такое не устраиволо(dbi и отладчик это совсем инструменты разные) и вывод шел в консоль, для этого вроде был не нужен гуи. Так трансляция начиналась на загрузочной фазе, пока не настроена среда; анализ всяких поделок, протекторов и тому подобного это требует, иначе поток будет утерян, те выйдет из под монитора. Другое дело как это запустить, это делалось точно не помню, но не просто флагами в реестре, там всякие опции есть. В общем говоря поищите, без этого просто запуском и отловом фаулта ничего не получится сделать. Какое то гадание, а не конкретная инфа. Обычно используется разбор лога, полученного в динамике, а не анализ статик дампа в котором нет временных маркеров. Сорян за корявость наверно текста)
Mikl___, у вас шла нумерация файлов а-ля tut_01c.asm tut01d.asm а в последем аттаче вдруг tut01b.asm может старая версия?
alex_dz, самый первый был tut_01a.asm, где я пытался найти только адрес LdrLoadDll для загрузки user32.dll, дальше я пытался добавить LdrGetProcedureAddressForCaller. После успешных запусков делается копия tut_01b.asm и пытаюсь модифицировать ее, в случае неудачи произойдет возврат к tut_01a.asm
да, падает сразу на входе в repe cmsb при первой же инструкции если оттрассировать в WinDbg (в х64dbg вообще пусто) то получается, что идёт обращение по недоступному адресу в Ntdll (к региону памяти Free): Код (Text): 0:000> (edc.a68): Access violation - code c0000005 (first chance) image00000000_00400000+0x2f0: 00000000`004002f0 f3a6 repe cmps byte ptr [rsi],byte ptr [rdi] ;//------------------ 0:000> r rsi,rdi rsi=000000007754001a rdi=000000000040030e ;//------------------ Проверим эти регионы памяти -------------- 0:000> !address 000000007754001a Usage: Free Base Address: 00000000`7752f000 End Address: 00000000`7efb0000 Region Size: 00000000`07a81000 Type: 00000000 State: 00010000 MEM_FREE <--------// Protect: 00000001 PAGE_NOACCESS 0:000> !address 000000000040030e Usage: Image Allocation Base: 00000000`00400000 Base Address: 00000000`00400000 End Address: 00000000`00401000 Region Size: 00000000`00001000 Type: 01000000 MEM_IMAGE State: 00001000 MEM_COMMIT Protect: 00000040 PAGE_EXECUTE_READWRITE More info: lmv m image00000000_00400000 More info: !lmi image00000000_00400000 More info: ln 0x40030e --- Сообщение объединено, 9 фев 2025 --- exe для поиска в экспорте (который я прикрепил выше) пробовал запускать? он находит у тебя на Win10 функцию и адрес LdrLoadDll() ?
нет это не работает - опять "repe cmpsb" да в принципе есть-же поддержка Win10, а моя Win7 не особо нужна общественности.