2013-09-28 13 views
2

我有一個PE文件,我嘗試反彙編它以獲取它的說明。不過我注意到0123'段不僅包含指令,還包含一些數據(我使用IDA注意到了這一點)。這裏的例子:如何消除PE文件的.text段中數據的指令?

.text:004037E4     jmp  ds:__CxxFrameHandler3 
.text:004037EA ; [00000006 BYTES: COLLAPSED FUNCTION _CxxThrowException. PRESS KEYPAD "+" TO EXPAND] 
.text:004037F0 ;    
.text:004037F0     mov  ecx, [ebp-10h] 
.text:004037F3     jmp  ds:[email protected]@@[email protected] ; std::exception::~exception(void) 
.text:004037F3 ; 
.text:004037F9 byte_4037F9  db 8Bh, 54h, 24h  ; DATA XREF: sub_401440+2o 
.text:004037FC     dd 0F4428D08h, 33F04A8Bh, 0F6B2E8C8h, 0C4B8FFFFh, 0E9004047h 
.text:004037FC     dd 0FFFFFFD0h, 3 dup(0CCCCCCCCh), 0E904458Bh, 0FFFFD9B8h 
.text:00403828 dword_403828 dd 824548Bh, 8BFC428Dh, 0C833F84Ah, 0FFF683E8h, 47F0B8FFh 
.text:00403828           ; DATA XREF: sub_4010D0+2o 
.text:00403828           ; .text:00401162o 
.text:00403828     dd 0A1E90040h, 0CCFFFFFFh, 3 dup(0CCCCCCCCh), 50E0458Dh 
.text:00403828     dd 0FFD907E8h, 458DC3FFh, 0D97EE9E0h 
.text:00403860     db 2 dup(0FFh) 
.text:00403862 word_403862  dw 548Bh 

我怎樣才能區分這些數據與指令?我對這個問題的解決方法是簡單地找到第一條指令(輸入地址)並訪問每條指令和所有調用的函數。不幸的是,它發生了一些代碼塊沒有直接調用,但他們的地址是在一些數據中的.rdata段,我不知道如何從數據有效的指令地址。

總結:有什麼方法可以決定.text段中的某個地址是否包含數據或指令?或者,有沒有什麼辦法可以決定.rdata中的哪些潛在地址應該被解釋爲指令地址和哪些數據?

回答

1

你一般不能。 PE文件的.text部分可以混合作者喜歡的任何方式的代碼和常量。像IDA這樣的程序試圖通過從入口點開始,然後反彙編,並查看哪些地址是跳轉的目標以及哪些讀取來理解這一點。但是迂迴的程序可能會在指令和數據之間「打」。

+0

因此,我可以肯定的正確拆卸的唯一指示是那些從入口點可訪問的指令? –

+0

@AdamSznajder:你可以確信的唯一指令是那些在程序的特定運行中由CPU實際執行的指令。對於其他所有事情你必須做出假設。 –