Рассчитать коды операций JMP - PullRequest
4 голосов
/ 19 ноября 2011

Я пытаюсь вычислить правильные коды операций для прыжка, я смотрел на это в других темах и до сих пор не понимаю:

Я думал, что формула была desination - (from+5), но она просто не работает, она далеко, вот адреса, к которым я хочу перейти с / на:

FROM: 6259326B
TO:   02980000

CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266

Так что у меня проблемы с этим, любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 20 ноября 2011

Вы рассчитываете отрицательный jmp!Итак, правильная формула:

0 - (от - назначение) - 5

0 - (6259326B - 02980000 $) - 5

чторавно $ A03ECD90 (или $ 90CD3EA0 в младшем порядке).

1 голос
/ 20 ноября 2011

Формула верна, предполагая, что инструкция перехода имеет ровно 5 байтов, а FROM является адресом этой инструкции перехода. Если длина не 5 или FROM не там, где находится jmp, это неверно.

С этим вы получаете по модулю 2 32 арифметика:

2980000H- (6259326BH + 5) = 0A03ECD90H.

Если вы не понимаете, как 2980000H - 62593270H равно 0A03ECD90H в 32 битах, представьте на мгновение, что вы вычитаете из 102980000H вместо 2980000H, то есть у вас установлен 33-й бит. Тогда у вас есть 102980000H - 62593270H = 0A03ECD90H. И вы можете проверить, что 102980000H = 62593270H + 0A03ECD90H. Но поскольку у вас есть только 32 бита для вычисления, этот 33-й бит, каким бы он ни был, не повлияет на сумму и разницу. Таким образом, вы просто вычитаете два числа как 32-разрядные числа и берете менее значимые 32-разрядные значения результата, игнорируя любые выдающиеся заимствования из битов, выходящих за пределы 32-го числа.

И 0A03ECD90H должен быть закодирован в инструкции jmp от младшего байта до старшего байта, поэтому вы получите следующую последовательность байтов, кодирующую инструкцию:

E9, 90, CD, 3E, A0.

A аналогичный вопрос задавался ранее.

1 голос
/ 20 ноября 2011

Формула в порядке (хотя кажется, что предоставленная сборка и адреса не совсем совпадают: 02980000 - 6259326b - 5 = c726cd90, обратный порядок байтов и он почти соответствует вашей правильной сборке, я полагаю, его из-за перемещения изображения и т. д.). Вы уверены, что правильно выполнили математические вычисления и в обратном порядке байтов, чтобы соответствовать требуемой кодировке (little-endian) для относительного 32-битного перехода?

...