目录
3.5 Displacement:辅助Mode R/M,计算地址偏移
1.反汇编
通过查表将机器指令解释为对应的汇编指令。
ProView是一款常见的反汇编引擎
2.反汇编相关工具介绍
OllyDBG:是一款专为Windows平台设计调试工具,反汇编辅助分析功能有限,不适用于静态分析
IDA Pro:辅助功能极为强大的反汇编静态分析工具
Ghidra:是由美国国家安全局(NSA)开发的开源反汇编和逆向工程工具。它可以处理多种类型的二进制文件,并同样提供了丰富的代码分析工具和插件支持
WinHex:是一款以通用的16进制编辑器为核心,专门用来对付计算机取证,数据恢复,低级数据处理,以及 IT 安全性、各种日常紧急情况的高级工具
WinDbg:一款Windows内核调试工具:
HOPPER:是一款Linux的反向工程工具,可让您反汇编和反编译32/64位IntelMac,Linux,Windows和iOS可执行文件。
3.Interl指令集结构
X86平台下汇编指令对应的二进制机器码为Intel指令集 - Opcode,Intel指令手册中描述的指令组成包含如下6部分。
3.1 Instruction Prefixes:指令前缀
指令前缀是可选的,作为指令的补助说明信息存在,主要用于以下4种情况。
(1)重复指令:如REP、REPE\REPZ
(2)跨段指令:如MOV DWORD PTR FS:[XXXX],0
(3)将操作数从32位转为16位:如MOV AX, WORD PTR DS:[EAX]
(4)将地址从16位转为32位:如MOV EAX, DWORD PTR DS:[BX+SI]
3.2 Opcode:指令操作码
Opcode为机器码中的操作符部分,用来说明指令语句执行什么样的操作,如某条汇编语句是MOV、JMP还是CALL。Opcode为汇编指令语句的主要组成部分,是必不可少的。对Opcode的解析也是反汇编引擎的主要工作。汇编指令助记符与Opcode是一一对应的关系。每一条汇编指令助记符都会对应一条Opcode码,但由于操作数类型不同,所占长度也不相同,
因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的,还需要Mode R/M、SIB、Displacement的帮助,才能够完整地解析出汇编信息。
3.3 Mode R/M:操作数类型
Mode R/M是辅助Opcode解释汇编指令助记符后的操作数类型。R表示寄存器,M表示内存单元。Mode R/M占一个字节的固定长度,如下图所示。第6、7位可以描述4种状态,分别用来描述第0、1、2位是寄存器还是内存单元,以及3种寻址方式。第3、4、5位用于辅助Opcode。
3.4 SIB:辅助Mode R/M,计算地址偏移
SIB的寻址方式为基址+变址,如MOV EAX, DWORD PTR DS:[EBX+ECX*2],其中的ECX、乘数2都是由SIB来指定的。SIB的结构如下图所示。SIB占1个字节大小,第0、1、2位用于指定作为基址的寄存器;第3、4、5位用于指定作为变址的寄存器;第6、7位用于指定乘数,由于只有两位,因此可以表示4种状态,这4种状态分别表示乘数为1、2、4、8。
3.5 Displacement:辅助Mode R/M,计算地址偏移
Displacement用于辅助SIB,如MOV EAX, DWORD PTR DS:[EBX+ECX*2+3]这条指令,其中的“+3”是由Displacement来指定的。
3.6 Immediate:立即数
用于解释指令语句中操作数为一个常量值的情况