Здравствуйте. Здесь (http://hacker-pro.net/thread/30531/p1.html) статья как вставить свой код в Pe файл. Удается в режиме отладки прописать свой код и он выполняется (olly 2.01 alpha 4 и некоторые пункты меню отличаются). Но при попытке сохранить пропатченый файл он оказывается неработоспособный т.к адреса которые я вписал во время выполнения (Push STRING_ADDR,Call MessageBoxA) сохраняется ровно такими как я и вписал (при новом запуске файла они уже не верны).В тоже время например первичный jmp в мою процедуру корректен при каждом новом запуске. Как сохранить корректными адреса где хранится строка и адреса вызываемых функций?
Я когда не знал про импорт, релоки и прочую лабуду, просто искал в пределах данного модуля похожие вызовы и копипастил байты напрямую ))
nop4 Так происходит из-за того, что адрес строки абсолютный. Есть два варианта это побороть: 1. Добавить релокации (relocations). Это может быть не очень простой путь, но в этом случае загрузчик при загрузке файла сам исправит адрес в инструкции. 2. Обращаться к строке по относительному адресу. Это потребует добавить больше кода. Т.е. нужно вычислить адрес добавленной строки относительно начала файла, затем получить актуальный адрес загрузки модуля, сложить эти значения и использовать. PROFIT!!!111 Псевдокод для такой операции выглядит примерно так: call @f @@: pop ebx sub ebx, @b ;ebx содержит базовый адрес загрузки модуля lea eax, [ebx + StringOffset] push eax call MessageBoxA Возможно, нужны какие-то корректировки (исходный файл я не смотрел), но идея, надеюсь, ясна.
Проще разместить строку в самом коде и использовать стандартный приемчик с call в обход строки: call metka db "Hello, world!",0 metka: ;здесь в стеке лежит адрес строки (как адрес возврата call)
Mika0x65 Шутки шутить изволите? nop4 Кстати, к варианту "добавить релокации" можно присоседить вариант "удалить релокации". Если их нет, то модуль не будет менять адрес своей загрузки (хотя даже если они есть, адрес загрузки совсем не обязан меняться при каждом запуске).
Спасибо!Но остался еще один баг - если файл открыть на другом компьютере он падает?Адрес USER32.MessageBoxA опять не валидный Для будущих поколений пригодится. В итоге применимо к http://hacker-pro.net/thread/30531/p1.html код выводе сообщения выглядит примерно так: Код (Text): >NOP CALL label ASCII "info",0 label: POP EAX PUSH 0 PUSH EAX PUSH EAX PUSH 0 LEA EAX,DWORD PTR DS:[USER32.MessageBoxA] CALL EAX ; USER32.MessageBoxA ;Здесь jmp туда откуда пришли
nop4, посмотри вот здесь, PE файл вызывающий MessageBox без всякого импорта, размер 97 байт, правда работать это на всей NT линейке не будет - писалось под XP
Mikl___ Там грязный хак использовался. nop4 Олли не вкомпиливает импорт, она инструкцию с адресом конпилит. Нормально вручную впиливается дамп загрузчика модуля из памяти и сам образ.
А вот это я не очень понимаю.Как вписать загрузчик модуля в тело редактируемой программы?К тому же там используются свои MessageBox и тд?
nop4 А если там используются свои MessageBox -- тогда ссылки на них в секции импорт и нужно использовать, а вот если требуемых API-функций в теле жертвы не обнаружено, тогда и требуется найти их адреса в памяти
nop4 Загрузчик это код самодостаточный и базонезависимый. Он предоставляет некоторый функционал через вызов его начала. Вот и добавляем в модуль загрузчик, загружаемый образ и стаб для его вызова. Если места не хватает, то расшариваем последнюю секцию. Никаких импортов, никаких релоков. Хорошо и годно.
Спасибо за ответы.А есть возможность снабдить ответ какими-либо ссылками на эту тему? Что-то нашел, но не знаю то это и актуально ли сейчас.