我只是在编写 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 寄存器中,并且我假设某物出现在以下字节中。但是我还不知道如何阅读该信息:)