Расчет адреса инструкции JMP

Я пытаюсь перехватить функцию, заменив ее начало инструкцией JMP, которая должна привести к моей функции. Но проблема в том, что я не знаю, как рассчитать смещение JMP для нацеливания на адрес моей функции. Что ж, я знаю, как это сделать, если вы переместитесь вперед в памяти (Адрес назначения - Текущий адрес), но у меня нет идей, как определить это, когда вы вернетесь в память.

Может кто-нибудь помочь?


person user972948    schedule 30.09.2011    source источник


Ответы (4)


Просто используйте отрицательное смещение для перехода назад.

И не забудьте учесть размер инструкции JMP. Смещение относится к концу инструкции JMP, а не к началу. Если текущий адрес - это то место, где вы собираетесь записать JMP, тогда вам понадобится сдвиг 5 + dest-current, поскольку размер инструкции JMP плюс смещение, если 5 байтов.

person David Heffernan    schedule 30.09.2011

Это основная математика, которую вы должны уметь вычислить. :)

Если JMP вперед Destination - Origin, то JMP назад будет Origin - Destination

Подумайте об этом в простых цифрах: если вы хотите JMP перемотать со 100 на 110, ваш JMP будет 110 - 100 = 10. Если вы хотите JMP назад на ту же сумму, это будет 100 - 110 = -10.

person Ken White    schedule 30.09.2011
comment
Нет-нет, я, конечно, умею прыгать вперед. Проблема в том, что я не уверен, как тогда рассчитать и представить его в HEX. Например, если я хочу перейти с адреса 1000 на 2000, это будет E9 3E8, но что будет, если я захочу перейти с адреса 2000 на 1000? Что-то ужасное вроде E9 FFFFFFFFFFFFFC18? - person user972948; 30.09.2011
comment
Hex ничем не отличается. Измените мой пример с 100 на 0x100 и 110 на 0x110, и математика останется прежней. - person Ken White; 30.09.2011
comment
user972948: ничего страшного, это просто два дополнения отрицательного смещения, которое вы хотите. - person SullX; 06.12.2014

относительные скачки имеют знак, то есть они имеют положительное и отрицательное смещение с использованием знакового бита. абсолютные прыжки абсолютны, так что это не имеет значения. см. тома 2A и 2B руководства по эксплуатации Intel.

person Necrolis    schedule 30.09.2011

Быть хитрым

Сделайте фиктивный вызов в место над вашей функцией

 call location1


 .location1
 call location2
 .location2
 pop ax
 ret
 .yourfunction

Теперь у вас есть адрес location2 в ax

добавьте 3 к ax, и у вас будет адрес памяти вашей функции

person ady    schedule 24.06.2013