Вычисление адреса инструкции JMP - PullRequest
2 голосов
/ 30 сентября 2011

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

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

Ответы [ 4 ]

5 голосов
/ 30 сентября 2011

Просто используйте отрицательное смещение, чтобы перейти назад.

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

3 голосов
/ 30 сентября 2011

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

Если JMP forward Destination - Origin, тогда JMP backward будет Origin - Destination

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

1 голос
/ 30 сентября 2011

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

0 голосов
/ 24 июня 2013

Будь подлый

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

 call location1


 .location1
 call location2
 .location2
 pop ax
 ret
 .yourfunction

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

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

...