反汇编引擎工作原理

发布于 2021-08-31  59 次阅读


反汇编,顾名思义就是将机器码翻译为对应的汇编指令,翻译的过程需要参考CPU的指令集,还需要根据不同的可执行文件找到对应的格式标准,找到代码段和数据段

x86平台下的汇编指令对应的机器码为inter指令集,可以通过他进行了解反汇编引擎大致的工作原理

Inter指令手册中个描述的指令由6部分组成

有些不太理解具体的工作流程,先记下来以后再看

INSTRUCTION PREFIXESOPCODEMODE R/MSIB DISPLACEMENTIMMEDIATE
指令前缀指令操作码操作数类型辅助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》中还给出了一段反汇编引擎的源码,目前还看不懂,先留着,以后再看