欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]反编译原理(12)-反混淆

[原创]反编译原理(12)-反混淆

IR

编译器/反编译器中间语言转换过程如下:
Target Dependent HIR → Target Independent HIR(Option) → Target Independent VMIR(Option) → Target Independent MIR → Target Independent LIR(Option) → Target Dependent LIR
IDA Pro SDK7.1版本开始,已经有部分中端MIR相关操作的API。(本文相关图片都来自官方博客Microcode in pictures)

BasicBlock,Edge

从SDK可知基本块类型BasicBlock有以下定义:

enum mblock_type_t

{

  // Virtual Entry

  BLT_NONE = 0, ///< unknown block type

  // Virtual Exit???

  BLT_STOP = 1, ///< stops execution regularly (must be the last block)

  // Exit???

  BLT_0WAY = 2, ///< does not have successors (tail is a noret function)

  // 无条件跳转

  BLT_1WAY = 3, ///< passes execution to one block (regular or goto block)

  // 条件跳转

  BLT_2WAY = 4, ///< passes execution to two blocks (conditional jump)

  // Switch

  BLT_NWAY = 5, ///< passes execution to many blocks (switch idiom)

  // IDA Pro 7.2新增,可能用于分析异常处理、闭包、协程等

  BLT_XTRN = 6, ///< external block (out of function address)

};

一种情况是流图的Edge是隐式的,比如LLVM的流图是这种情况,IDA Pro的流图也是这种情况;一种是流图的Edge是显式的,GCC的流图就是这种情况。
基本块是用双向链表存储的。

Entry,Exit

一种情况是流图的Entry和Exit是Real Entry和Real Exit,比如LLVM的流图是这种情况;一种是流图的Entry和Exit是Virtual Entry和Virtual Exit,比如GCC的流图就是这种情况,IDA Pro的流图也是这种情况,控制流图有额外的Virtual Entry和Virtual Exit。

Instruction

AT&T-like语法,即第一个操作数是源操作数而不是目的操作数(Intel语法第一个操作数是目的操作数),当前有72条指令,指令也是用双向链表存储的。

图论

熟悉了解DFS,Dominator,Strongly Connected Components等理论,可以使用Boost Graph库

SSA

经典的方法先计算Dominance Frontiers,然后构造SSA PHI,最新的实现方法是这篇论文:
Simple and Efficient Construction of Static Single Assignment Form,推荐关于静态单赋值SSA的书籍:

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功