Windows PE文件操作码
我正在编写一个PE文件解析器,现在我想解析和解释PE文件中的实际代码,我假设它们存储为x86操作码 例如,DLL中的每个导出都指向函数将存储在内存中的RVA(相对虚拟偏移量),我编写了一个函数将这些RVA转换为物理文件偏移量 问题是,这些真的是操作码,还是其他什么 函数在文件中的存储方式取决于编译器/链接器,还是取决于单字节或双字节X86操作码 例如,Windows 7 DLL“BWContextHandler.DLL”包含四个加载到内存中的函数,使它们在系统中可用。第一个导出的函数是“DllCanUnloadNow”,它位于文件中的偏移量0x245D处。此数据的前四个字节是:0xA1 0x5C 0xF1 0xF2 那么,这是一个或两个字节的操作码,还是完全其他的东西 如果有人能提供任何关于如何检查这些的信息,我们将不胜感激 谢谢 在进一步阅读并通过IDA的演示版本运行该文件之后,我认为我正确地说第一个字节0xA1是一个单字节操作码,意思是mov eax。我是从这里得到的:我现在假设它是正确的Windows PE文件操作码,windows,parsing,assembly,x86,portable-executable,Windows,Parsing,Assembly,X86,Portable Executable,我正在编写一个PE文件解析器,现在我想解析和解释PE文件中的实际代码,我假设它们存储为x86操作码 例如,DLL中的每个导出都指向函数将存储在内存中的RVA(相对虚拟偏移量),我编写了一个函数将这些RVA转换为物理文件偏移量 问题是,这些真的是操作码,还是其他什么 函数在文件中的存储方式取决于编译器/链接器,还是取决于单字节或双字节X86操作码 例如,Windows 7 DLL“BWContextHandler.DLL”包含四个加载到内存中的函数,使它们在系统中可用。第一个导出的函数是“DllC
然而,我对下面的字节如何构成指令的其余部分感到有点困惑。从我所知道的x86汇编程序来看,move指令需要两个参数,目标和源,因此该指令将(某物)移动到eax寄存器中,我假设某物在以下字节中。然而,我还不知道如何读取这些信息:)x86编码是复杂的多字节编码,您不能像在RISC(MIPS/SPARC/DLX)中那样在指令表中找到一行代码来对其进行解码。一条指令甚至可以有16字节的编码:1-3字节的操作码+几个前缀(包括)+几个字段来编码立即数或内存地址、偏移量、缩放(imm、ModR/M和SIB;MOFF)。有时有几十个操作码用于单个助记符。此外,对于几种情况,同一asm行有两种可能的编码(“inc eax”=0x40和=0xff 0xc0) 单字节操作码,表示mov eax。我是从这里得到的:我现在假设它是正确的 让我们在桌子上看一看: po;flds;助记符;op1;op2;grp1;grp2;描述 A1;W压敏电阻;eAX;Ov;消息;datamov;搬家 (提示:不要使用geek32表,切换到-is会有更少的字段和更多的解码,例如“A1 MOV eAX moffs16/32 Move”) 有用于操作数的列op1和op2。A1操作码的第一个总是
eAX
,第二个(op2)是Ov。根据下表:
O/moffs原始指令没有ModR/M字节;操作数的偏移量在指令中编码为字、双字或四字(取决于地址大小属性)。不能应用基址寄存器、索引寄存器或比例因子(只有MOV(A0、A1、A2、A3))
因此,在A1操作码之后,内存偏移量被编码。我认为x86有32位偏移量(32位模式)
PS:如果您的任务是解析PE而不是发明反汇编程序,请使用一些x86反汇编库,如libdisasm或libudis86或其他任何东西
PPS:对于原始问题:
问题是,这些真的是操作码,还是其他什么
是的,“A1 5C F1 F2 05 B9 5C F1 F2 05 FF 50 0C F7 D8 1B C0 F7 D8 C3 CC”是x86机器代码。反汇编非常困难,特别是对于Visual Studio编译器生成的代码,尤其是对于x86程序。有几个问题: