2012-04-27 79 views
1

現在我已經從EIP寄存器獲得了機器指令地址。這個機器指令可以改變某個區域的內存的值,我想要但不能得到這個內存的地址。如何獲取一條機器指令寫入的地址?

當然,我可以從機器指令的地址讀取數據,但內容是機器指令,如:0x8b0c4d8b ......,它是不可讀的(我不能使用gdb等調試工具)。

如何獲取一條機器指令將寫入的地址?

+1

使用調試器 - 在該指令的地址中設置斷點,然後在斷點處檢查EIP - 這是唯一可靠的方法。 – 2012-04-27 08:00:04

+0

但EIP是指令的地址,我說得對嗎?我仍然無法獲得該指令將寫入的地址。 – zsounder 2012-04-27 08:12:39

+0

我覺得@PaulR misspoke;儘管如此,仍然有必要使用反彙編程序(或者內置一個工具)或編寫自己的工具來知道如何反彙編x86操作碼。 – geekosaur 2012-04-27 08:16:15

回答

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。它允許examining operands的說明。對於ARM,請參閱disarm

+0

抱歉,我的示例0x8b0c4d8b不是一個好的。 – zsounder 2012-04-27 08:26:00

+0

儘管這在一般情況下不起作用 - 僅適用於硬編碼地址(即不涉及基於寄存器的尋址時) - 唯一可靠的方法是在調試器下運行代碼並檢查相關寄存器(s) 。 – 2012-04-27 08:34:07

+0

@PaulR:是的,我知道。我提供了這個答案,因爲OP提到他不能使用調試器。 – Job 2012-04-27 08:35:11