OllyDBG和IDA都有一个很重要的功能:反汇编
在X86平台下使用的汇编指令对应的二进制机器码为Intel 指令集一Opcode,Intel指令手册中描述的指令由6部分组成:
Irsinucton Prefixes 指令前缀
Opcode 指令操作码
Mode R/M 操作数类型
SIB Displacement 辅助Mode R/M,计算偏移地址
Immedate 立即数
Instuction Prefixes:指令前缀
指令前缀是可选的,作为指令的补助说明信息存在,主要用于以下4种情况。
重复指令:如REP、REPE\REPZ
跨段指令:如MOV DWORD PTR FS:[XXXX], 0
将操作数从32位转为16位:如MOV AX,WORD PTR DS:[EAX]
将地址从16位转为32位:如MOV EAX,DWORD PTR DS:[BX+SI]
Opcode:指令操作码
Opcode为机器码中的操作符部分,用来说明指令语句执行什么样的操作,如某条汇编语句是MOV、JMP还是CALL。Opcode为汇编指令语句的主要组成部分,是必不可少的。对Opcode的解析也是反汇编引擎的主要工作。
汇编指令助记符与Opcode是--一对应的关系。每一条汇编指令助记符都会对应一条Opcode码,但由于操作数类型不同,所占长度也不相同,因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的,还需要Mode R/M、SIB、 Displacement 的帮助,才能够完整地解析出汇编信息。
Mode RIM:操作数类型
Mode R/M是辅助Opcode解释汇编指令助記符后的操作数类型. R表示寄存器, M表示内存単元。Mode R/M占一个字节的固定长度,第6、