Получение операнда из инструкции - PullRequest
1 голос
/ 14 мая 2010

С учетом следующих инструкций по сборке x86:

mov     esi, offset off_A
cmp     esi, offset off_B

как бы получить смещения (второй операнд) во время выполнения? Это сценарий: программа (внедренная в процесс во время выполнения) заменяет смещения несколькими собственными, что приводит к:

mov     esi, offset off_X
cmp     esi, offset off_Y

Эта программа позволяет писать и загружать плагины через нее, но не отображает адреса замены. Итак, учитывая адреса, по которым существуют вышеприведенные инструкции, как мне найти смещения X и Y?

Ответы [ 3 ]

1 голос
/ 16 мая 2010

Я не совсем понимаю, для чего это нужно, но ...

mov esi, ... кодируется как BE, за которым следует операнд dword. Если у вас есть адрес инструкции mov, вы можете просто пропустить один байт вперед и увидеть операнд адреса, off_A

cmp esi, ... кодируется как 81 FE, за которым следует операнд dword, поэтому здесь можно пропустить два байта, чтобы увидеть операнд.

0 голосов
/ 18 мая 2010

Существует много способов кодирования MOV ESI, немедленного. В зависимости от вашего ассемблера и компилятора может использоваться любой из них.

Если вы делаете это без использования мнемоники ассемблера, как в hex. Вы можете точно определить смещения:

db 0xBE; off_X: dd normal_offset
0 голосов
/ 14 мая 2010

Я не уверен, что вы спрашиваете. Смещение - это адрес. Так что первая строка кода перемещает адрес off_9F6FBC в esi.

Если вы имеете в виду, как получить абсолютный адрес (в сочетании с PIC и т. Д.), То это невозможно узнать во время разборки. Он известен только во время выполнения и может меняться при каждом запуске

...