Как получить адрес, по которому пишется одна машинная инструкция?

Теперь у меня есть адрес машинной инструкции из реестра EIP. Эта машинная инструкция может изменить значение определенной области памяти, я хочу, но не могу получить адрес этой памяти.

Конечно, я мог бы прочитать данные из адреса машинной инструкции, но содержимое машинной инструкции, например: 0x8b0c4d8b ......, нечитаемо (я не могу использовать инструменты отладки, такие как gdb).

Как получить адрес, по которому будет писать одна машинная инструкция?


person timestee    schedule 27.04.2012    source источник
comment
Используйте отладчик - установите точку останова по адресу этой инструкции, затем проверьте EIP, когда вы нажмете точку останова - это единственный надежный способ.   -  person Paul R    schedule 27.04.2012
comment
Но EIP - это адрес инструкции, я прав? Я до сих пор не могу получить адрес, на который будет писать эта инструкция.   -  person timestee    schedule 27.04.2012
comment
Я думаю, что @PaulR оговорился; тем не менее, по-прежнему верно, что вам придется использовать дизассемблер (или инструмент со встроенным дизассемблером) или написать свой собственный инструмент, который знает, как дизассемблировать коды операций x86.   -  person geekosaur    schedule 27.04.2012
comment
@geekosaur, я написал свои собственные инструменты отладки, это простой отладчик без поддержки символов и поддержки дизассемблирования. Но кажется, сложно разобрать коды операций x86.   -  person timestee    schedule 27.04.2012
comment
Извините, я имел в виду проверку соответствующих регистров, а не проверку EIP, конечно.   -  person Paul R    schedule 27.04.2012


Ответы (1)


Если вам известен машинный код, на который указывает EIP, и вы просто хотите его разобрать, сделайте что-то вроде этого (я взял ваш пример 0x8b0c4d8b):

#create binary file
$ echo -en "\x8b\x0c\x4d\x8b" > foo.bin

#disassemble it
$ objdump -D -b binary -m i386 foo.bin 

foo.bin:     file format binary


Disassembly of section .data:

00000000 :
   0:   8b                      .byte 0x8b
   1:   0c 4d                   or     $0x4d,%al
   3:   8b                      .byte 0x8b

Таким образом, в этом случае он не изменяет никакого места в памяти, но если это произошло, вы можете легко увидеть это из ассемблерного кода.

Изменить: Судя по комментариям, вы хотите сделать это программно. Взгляните на udis86. Он позволяет просматривать операнды инструкций. Для ARM см. разоружение.

person mtvec    schedule 27.04.2012
comment
Однако в общем случае это не сработает - только для жестко закодированных адресов (т.е. не когда используется адресация на основе регистров) - единственный надежный метод - запустить код под отладчиком и проверить соответствующие регистры. - person Paul R; 27.04.2012
comment
@PaulR: Да, я знаю. Я предоставил этот ответ, потому что ОП упомянул, что не может использовать отладчик. - person mtvec; 27.04.2012
comment
Да, я не знал, могу ли я использовать инструменты отладки, такие как gdb, значит ли это, что я не знаю, как использовать инструменты отладки, такие как gdb, или есть какая-то техническая причина, почему я не можете использовать инструменты отладки, такие как gdb? - person Paul R; 27.04.2012
comment
есть какая-то техническая причина, по которой я не могу его использовать. я хочу, чтобы этот процесс выполнялся моим собственным процессом, поэтому я пишу меньший отладчик. - person timestee; 27.04.2012
comment
@AlanGame: udis86 — это библиотека, вы можете вызвать ее из своего собственного процесса. - person mtvec; 27.04.2012
comment
@Job Спасибо, это отличная работа, есть ли библиотека для руки? - person timestee; 27.04.2012