Код (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 и отладчик это совсем инструменты разные) и вывод шел в консоль, для этого вроде был не нужен гуи. Так трансляция начиналась на загрузочной фазе, пока не настроена среда; анализ всяких поделок, протекторов и тому подобного это требует, иначе поток будет утерян, те выйдет из под монитора. Другое дело как это запустить, это делалось точно не помню, но не просто флагами в реестре, там всякие опции есть. В общем говоря поищите, без этого просто запуском и отловом фаулта ничего не получится сделать. Какое то гадание, а не конкретная инфа. Обычно используется разбор лога, полученного в динамике, а не анализ статик дампа в котором нет временных маркеров. Сорян за корявость наверно текста)
да, падает сразу на входе в 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() ?
у меня на Win7 + x64dbg пациент вообще не открывается - даже до ЕР не доходит, и сразу ошибка. Можно только закрыть дебагер. А вот WinDbg открывает и позволяет степать до исключения AV. Поэтому на ВМ придётся только WinDbg ставить.
Наверное я ввёл в заблуждение по поводу LdrGetProcedureAddressForCaller (давно семёркой не пользуюсь, поэтому не проверил сразу). В экспорте ntdll.dll (6.1.7601) этой функции ещё нет, она появилась в Windows 10. Для Windows 7 нужно использовать LdrGetProcedureAddressEx.
урря! пример tut_1e.asm наконец-то завелся https://prnt.sc/w9A-EPEy1CRH (тот что поменьше по размеру, побольше - тоже падает)
Что то я вообще не понял, Как бы прежним постом ответил наверно на две темы, там товарищ пытается выгрузить юзер и какие то ошибки в загрузчике. Подумал а почему небыло ответа, затем внимательно уже посмотрел тот как назвать.. дебаг ручной вывод с ошибкой. Получается что падает не загрузчик, а шелл выше приведенный. Это я посмотрел разумеется, посмотрел как это делалось ранее, очевидной ошибки не видно, если сравнить с безотказно работающем шелл 86(те регистры сохраняются верно). В принципе если уж наверняка разобраться не имея динамик данных, это придется лезть в документацию формата, что делать не хочется. И вот интересно, на какой итерации ошибка. Была какая то особенность в некоторых либах, из за чего парс экспорта падал. Но не могу найти. Может подебажить и вставить лог на каждой итерации, выяснить причину?
Если для Windows 7 нужно использовать LdrGetProcedureAddressEx и LdrGetProcedureAddressForCaller появилась в Windows 10, тогда попробуйте это
Ура, пашет Via ntdll export: Addr = 000000007783A330 Name = LdrLoadDll Addr = 000000007777E2B0 Name = LdrGetProcedureAddressEx Via GetModuleHandle + GetProcAddress: Addr = 000000007783A330 Name = LdrLoadDll Addr = 000000007777E2B0 Name = LdrGetProcedureAddressEx
alex_dz, Marylin, k3rnl, видимо и предыдущие должны были работать, если бы функция LdrGetProcedureAddressForCaller была в Windows 7, там, скорее всего, моя программа пробежалась по именам функций, но не найдя LdrGetProcedureAddressForCaller, подставила 0 вместо адреса.
Mikl___, на ядре 10.0 как работало так и работает. Только почему-то Дефендер стал ругаться на tut_01f.exe
Тимур, это не прикол, это фича . Нет, конечно, я не знаю, как поведет себя программа в Win7. Я добавил вместо сравнения имен сравнение примитивных хэшей, а вот для RtlExitUserProcess мой хэш не годится, даже если сравнивать кроме хэша еще и длину названия функции, все равно происходят коллизии... Я не думал, что написание простой программы растянется на 3 страницы, но буду пробовать дальше...