【程序分析】Code Lifting

CodeLifting涉及两种主要含义:一是将二进制代码提升到高级语言的语句级别,包括指令组装和寄存器到变量的映射;二是逆向工程中选择性地提取和模拟执行函数的部分代码。QBDL和Unicorn是用于安卓app的CodeLifting工具,帮助专注于函数中相关指令的执行,简化复杂性的处理。
摘要由CSDN通过智能技术生成

第一种含义

第一种含义中,Code Lifting和反编译的概念类似

常规的编译过程是这样的:
在这里插入图片描述
这是一个从高级形式到低级形式的过程,一般叫做 lowering

而反编译,是这样一个过程:
在这里插入图片描述
这个过程是完全相反的,叫做lifting

需要注意

  1. Binary到ASM这一步是反汇编,一般编译器都自带这个功能。反汇编是从byte code到汇编代码的过程,有固定的规则,没有花样可以玩儿。
  2. ASM到IR没有固定的套路,不同的反编译工具有不同的求解方法。
  3. IR到AST这步是最复杂的。
  4. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值