第一种含义
第一种含义中,Code Lifting和反编译的概念类似
常规的编译过程是这样的:
这是一个从高级形式到低级形式的过程,一般叫做 lowering
而反编译,是这样一个过程:
这个过程是完全相反的,叫做lifting
需要注意
- Binary到ASM这一步是反汇编,一般编译器都自带这个功能。反汇编是从byte code到汇编代码的过程,有固定的规则,没有花样可以玩儿。
- ASM到IR没有固定的套路,不同的反编译工具有不同的求解方法。
- IR到AST这步是最复杂的。
- AST到源码是遍历语法树,dump出来得到源码。
这里举【ACSAC 2022】 iService 论文中的例子
将二进制程序从 指令级别 提升到 语句级别 ,包括汇编指令组装与寄存器到变量的映射
- 指令组装:将多个具有关联的指令合并为一句语句
例如将函数调用call 指令和向寄存器存放参数的指令,组装为一个函数调用语句 - 寄存器到变量的映射:合并不同寄存器存储的相同变量,以及寄存器加偏移量表示的内存对象
- 指令组装:左侧的第16-18行,组装成右侧的第4行
- 寄存器到变量的映射:左侧的第14、15 行指令,整合成右侧的第2 行对block1.isa的赋值
第二种含义
第二种含义中,Code Lifting的含义是“代码提取”
也就是逆向过程中,不执行整个函数的全部代码,而是把函数的一部分指令“提取”出来,再单独模拟执行,类似Code Emulation
针对安卓app,常用的Code Lifting工具是QBDL 和 Unicorn。
Code lifting enables to run the instructions that are relevant to meet
our needs, regardless of the global complexity of the function. The
main reverse-engineering task was only identifying these relevant
instructions.
QBDL:https://github.com/quarkslab/QBDL
Unicorn:https://github.com/unicorn-engine/unicorn
参考:
基于code lifting的二进制差异消除
https://zhuanlan.zhihu.com/p/341448835
DroidGuard: A Deep Dive into SafetyNet - sstic