Рассчитать коды операций JMP

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

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

FROM: 6259326B
TO:   02980000

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

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


person Drahcir    schedule 19.11.2011    source источник


Ответы (3)


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

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

0 - ($6259326B - $02980000) - 5

что равно $A03ECD90 (или $90CD3EA0 с прямым порядком байтов).

person GJ.    schedule 19.11.2011
comment
Спасибо за ваш ответ, он помог, код, который я сейчас использую, to-5-from дает тот же результат, что и ваш. Буду ли я прав, если скажу, что мой новый код будет работать для всех 5-байтовых переходов? - person Drahcir; 20.11.2011
comment
@Richard Livingston: Да, это должно работать для всех 5-байтовых переходов кода операции. - person GJ.; 20.11.2011

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

person Necrolis    schedule 19.11.2011

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

При этом вы получаете арифметику по модулю 232:

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.

Ранее уже задавался похожий вопрос.

person Alexey Frunze    schedule 19.11.2011