Здравствуйте. Третий день пытаю дллку. И все время возникают какие-то ошибки... На данный момент, я не понимаю как мне правильно вызывать функцию, которую жестко прописал в дебаггере, в длл. Если адрес функции во время моей работы был 0009999BF, то после сохранения дллки, выгрузке и последующей загрузке, адрес функции меняется на 009998BF, но в моем патче адрес остается 0009999BF и вылетает violation... То же самое с PUSH... Как мне быть?
вызывайте функцию не по абсолютному адресу, а по смещению... и еще надо бы учитывать всякие моменты типа возможных релокаций, динамического базового адреса и тд, лучше ничего не хардкодить...
другой опкод команды call... смотрите здесь: http://asmworld.ru/spravochnik-komand/call/ я чет не понял похоже... я подумал, что вы пропатчили какой-то код в существующей dll и у вас проблема с вызовом... я правильно понял?
1. Нужно пересчитывать VA в смещение, VA будет зависеть от адреса загрузки и RVA (смещения относительно базы). 2. Может быть проще привязаться не к адресу, а сигнатуре? Ищем уникальную последовательность байт в той же секции и поблизости от точки патча и оперируем смещением от сигнатуры. При патче, отыскиваем сигнатуру в памяти процесса и voila! (Есть готовые патчеры, позволяюшие сигнатурный поиск).
если все-таки call не осилишь, то заюзай push/ret , правда адрес возврата прийдется сохранить, но зато не надо будет высчитывать смещениие )
чтобы минимизировать вероятность ошибки, чулке не пересчитывать вручную, а воспользоваться инструментарием типа hiew