【发布时间】:2012-11-25 16:24:20
【问题描述】:
我正在编写一个 PE 文件解析器,我已经到了想要解析和解释 PE 文件中的实际代码的地步,我假设这些代码存储为 x86 操作码。
例如,DLL 中的每个导出都指向函数将存储在内存中的 RVA(相对虚拟偏移),我编写了一个函数来将这些 RVA 转换为物理文件偏移。
问题是,这些真的是操作码,还是别的什么?
函数在文件中的存储方式是否取决于编译器/链接器,或者它们是一字节还是两字节 X86 操作码。
例如,Windows 7 DLL 'BWContextHandler.dll' 包含四个加载到内存中的函数,使它们在系统中可用。第一个导出的函数是“DllCanUnloadNow”,它位于文件内的偏移量 0x245D。该数据的前四个字节为:0xA1 0x5C 0xF1 0xF2
那么这些是一字节还是二字节的操作码,还是完全不同?
如果有人能提供有关如何检查这些的任何信息,将不胜感激。
谢谢!
经过进一步阅读,并通过 IDA 的演示版运行文件,我认为我说第一个字节 0xA1 是一个字节操作码是正确的,意思是 mov eax。我是从这里得到的:http://ref.x86asm.net/geek32.html#xA1,我假设它暂时是正确的。
但是,对于后面的字节如何构成指令的其余部分,我有点困惑。从我所知道的 x86 汇编器来看,一条移动指令需要两个参数,即目标和源,因此该指令是将(某物)移动到 eax 寄存器中,并且我假设该某物出现在以下字节中。但是我还不知道如何阅读该信息:)
【问题讨论】:
-
此相关帖子stackoverflow.com/questions/2170843/… 包含许多可以帮助您的信息。
-
谢谢fvu,我会读一读!
-
.text部分可以包含代码和只读数据(但主要是代码)。您可以使用反汇编程序来确定什么对应于什么。 -
使用 /disasm 选项在您的可执行文件上运行 dumpbin.exe 以查看它是如何完成的。请注意,您正在重新发明轮子。始终将 dumpbin.exe 告诉您的内容与您显示的内容进行比较,以确保它不是方形的。
-
顺便说一句,我刚刚发现了这个很棒的网站:onlinedisassembler.com/odaweb/run_hex
标签: windows parsing assembly x86 portable-executable