Marylin, не понимаю... Что-то рушится между вызовами find, edi привязан к реальным строкам rsi к r11 = NamePointers но ничего аномального не вижу
у меня на 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 вместо адреса.
alex_dz, что такое A/V? Audio/Video? Alcohol per Volume? Air Vehicle? Adult video? Ambulance Victoria? Access violation?
Mikl___, на ядре 10.0 как работало так и работает. Только почему-то Дефендер стал ругаться на tut_01f.exe
Тимур, это не прикол, это фича . Нет, конечно, я не знаю, как поведет себя программа в Win7. Я добавил вместо сравнения имен сравнение примитивных хэшей, а вот для RtlExitUserProcess мой хэш не годится, даже если сравнивать кроме хэша еще и длину названия функции, все равно происходят коллизии... Я не думал, что написание простой программы растянется на 3 страницы, но буду пробовать дальше...