我有一个PE文件,我尝试反汇编它以获得它的说明。但是我注意到.text
段不仅包含指令,还包含一些数据(我使用IDA注意到这一点)。这是一个例子:
.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:??1exception@std@@UAE@XZ ; 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
中哪些潜在地址应该被解释为指令地址和哪些数据?
答案 0 :(得分:1)
总的来说,你不能。 PE文件的.text部分可以按照作者喜欢的方式混合代码和常量。像IDA这样的程序尝试通过从入口点开始然后反汇编,并查看哪些地址是跳转的目标以及哪些读取来理解这一点。但是,狡猾的程序可以在指令和数据之间“打平”。