反汇编,顾名思义就是将机器码翻译为对应的汇编指令,翻译的过程需要参考CPU的指令集,还需要根据不同的可执行文件找到对应的格式标准,找到代码段和数据段
x86平台下的汇编指令对应的机器码为inter指令集,可以通过他进行了解反汇编引擎大致的工作原理
Inter指令手册中个描述的指令由6部分组成
有些不太理解具体的工作流程,先记下来以后再看
INSTRUCTION PREFIXES | OPCODE | MODE R/M | SIB DISPLACEMENT | IMMEDIATE | |
---|---|---|---|---|---|
指令前缀 | 指令操作码 | 操作数类型 | 辅助Mode R/M,计算地址偏移 | 立即数 |
- instruction prefixes:指令前缀 这是一个可选的参数,是作为指令的补助说明存在,主要用于以下四种情况。 重复指令:如REP、REPE\REPZ 跨段指令: 如 mov dword ptr fs:[ ] ,0 将操作数从32位转为16位:如 mov ax,word ptr ds:[ eax ] 将地址从16位转为32位
- opcode :指令操作码 opcode为机器码中操作符的部分,用来说明指令语句执行什么样的操作,如某条指令是mov,jmp还是call。opcode是唯一必不可少的参数。 汇编指令与opcode是一一对应的关系。 因为操作数的不同,所占长度也不同,因此对于非单字节指令来说,解析一条汇编指令还需要mode r\m、sib、dislacement的帮助
- Mode R/M:操作数类型mode r/m 是辅助opcode解析汇编指令助记符后的操作数类型,R表示寄存器,M表示内存单元,
- SIB:辅助Mode R/M ,计算地址偏移sib的寻址方式为基址+变址,如mov eax,dword ptr ds:[ ebx + ecx * 2 ],其中的ecx、乘数2都是由sib来指定的
- displacement:辅助Mode R/M ,计算地址偏移displacement用于辅助sib,如mov eax,dword ptr ds:[ ebx + ecx * 2 + 3 ]这条指令中的 “ + 3 ” 就是由displacement来指定的
- immediate :立即数 用于结束指令语句中操作数为一个常量值的情况
《DRE》中还给出了一段反汇编引擎的源码,目前还看不懂,先留着,以后再看
Comments NOTHING