Есть программа с некоторым функционалов в точке входа (адрес 0x401000). Я хочу модифицировать этот функционал, не поломав файл. Для этого я хочу в области нулей написать свой код и сделать на него переход. В этом коде я в том числе хочу передать управление на оригинальную точку входа. Но есть две проблемы: 1) Когда я хочу сделать переход на оригинальную точку входа, в области нулей при помощи HIEW я ассемблирую код call 0401000, но в результате получается какой-то мусор (опкод E8100D4000). OllyDbg не может правильно выполнить эту инструкцию и тоже показывает не те команды, которые я ожидаю. Как правильно ассемблировать такие переходы? 2) В своем новом коде я хочу вызывать системные апи. Как, например, в HIEW ассемблировать вызов системных апи типа call MessageBoxA? Я так и записываю, но HIEW говорит, что не понимает, что от него хотят.
Обычно такие штуки делают cff explorer'ом, тебе надо секцию добавить и в импорт накидать дополнительных функций. В hiew наверное лучше не ассемблировать ничего серьезного, дополнительный кусок кода проще собирать внешним ассемблером, объявив в нем адреса из импорта и базовый адрес, по которому он будет находиться в образе. Можно оформить в фасме, который сам при сборке поселит нужный код куда надо.
А как ассемблировать инструкцию call 04010EB в олли или в hiew? Это начало моего кода. Почему-то инструкция call 04010eb превращается в 00401109 E8 DF0D4000 CALL 00801EED 0040110E E8 DA0D4000 CALL 00801EED
Внутри инструкции смещение относительно ea + 5 801EED - 00401109 - 5 = 400DDF (в LE в самой инструкции закодировано: DF0D4000). Наверное ты ассемблируешь ее не там, куда помещаешь. Должно быть: 04010EB - 00401109 - 5 = FFFFFFDD E8 DDFFFFFF
Aoizora, 4010EB(адрес функции) - 00401109 (текущий адрес) -5(длина кодировки CALL) = -23 = FFFFFFDD 00401109: E8 DDFFFFFF = call 4010EB у тебя 00401109: E8 DF0D4000 00401109+00400DDF+5 = 00801EED но это при обращении к твоим собственным функциям (CALL=E8 адрес), а для вызова системной функции, ее адрес нужно найти в секции Import и сделать КОСВЕННЫЙ вызов (CALL=FF15 адрес)
Aoizora, > Для этого я хочу в области нулей написать свой код и сделать на него переход. В этом коде я в том числе хочу передать управление на оригинальную точку входа. В нулях исполнение заблокировано системой, это нижняя часть ап. Сделано по причине нулевого раскрытия ссылки - это самые простые ошибки в км. Управление передавалось lpe на нулевой адрес. По этой причине первый блок в ап заблокирован. Что ты под этим имеешь ввиду твоё личное дело.
Я размещаю код в нулях, которые выравнивают секцию кода. У меня секция кода смержена с данными, и там есть еще и импорт, но немного свободного места остается.
Aoizora, внимательно прочитай сообщения #2 и #6 а загрузчик твоей программы знает, что там у тебя секция импорта? а РЕ-заголовок откорректирован? а в секции импорта есть строка с именем функции и именем dll, из которой эта функция берется?
Я уже сделал. Файл очень простой, проблема была именно в понимании того, как работает инструкция call. Файл очень компактный, но в конце место для внедрения было.