quarkslab/qsynthesis
GitHub: quarkslab/qsynthesis
一个基于灰盒程序合成方法的二进制代码去混淆框架,用于将复杂的混淆汇编指令还原为语义等价的简洁表达式。
Stars: 169 | Forks: 18
# Qsynthesis
QSynthesis 是一个用于执行基于 I/O 的位向量(bitvector)表达式程序合成的 Python3 API。它旨在促进代码去混淆(deobfuscation)。
该算法采用灰盒(greybox)方法,结合了基于黑盒 I/O 的合成与白盒 AST 搜索来合成子表达式*(如果根节点无法合成)*。
该算法最初在 BAR 学术研讨会上进行了描述:
* [QSynth: A Program Synthesis based Approach for Binary Code Deobfuscation](https://archive.bar/pdfs/bar2020-preprint9.pdf)
(使用的基准测试可在[此处](https://github.com/werew/qsynth-artifacts)获取)
该代码作为以下 Black Hat 演讲的一部分发布:
* [Greybox Program Synthesis: A New Approach to Attack Dataflow Obfuscation](https://www.blackhat.com/us-21/briefings/schedule/index.html#greybox-program-synthesis-a-new-approach-to-attack-dataflow-obfuscation-22930)
**免责声明:此框架为实验性质,仅应用于实验目的。其主要旨在激发该领域的研究。**
## 文档
安装、示例和 API 文档可在专用文档页面找到:[Documentation](https://quarkslab.github.io/qsynthesis)
## 功能
核心合成基于 [Triton](https://triton.quarkslab.com) 符号执行引擎,整个框架均构建于此之上。它提供以下功能:
* 位向量表达式的合成
* 能够通过 SMT 检查合成表达式的语义等价性
* 能够合成常量*(如果表达式编码了一个常量)*
* 能够通过学习机制随时间改进预言机(oracles,预计算表)
* 能够将合成表达式重新汇编回汇编代码
* 能够通过 REST API 提供预言机服务以简化合成使用
* 提供集成合成功能的 IDA 插件
## 快速开始
### 安装
为了正常工作,首先需要安装 Triton:[install documentation](https://triton.quarkslab.com/documentation/doxygen/index.html#install_sec)。
Triton 不会自动安装在 virtualenv 中,请将其复制到您的 venv 中,或者在配置 venv 时使用 --system-site-packages。
然后:
```
$ git clone https://github.com/quarkslab/qsynthesis.git
$ cd qsynthesis
$ pip3 install '.[all]'
```
``[all]`` 将安装所有依赖项*(有关轻量级安装,请参阅文档)*。
### 表生成
合成算法需要生成源自文法*(一组变量和运算符)*的预言机(oracle)表。Qsynthesis 安装提供了 ``qsynthesis-table-manager`` 实用程序来操作表。以下命令生成一个包含 3 个 64 位变量、5 个运算符的表,使用 16 个输入的向量。我们将生成限制为 500 万条目。
```
$ qsynthesis-table-manager generate -bs 64 --var-num 3 --input-num 16 --random-level 5 --ops AND,NEG,MUL,XOR,NOT --watchdog 80 --limit 5000000 my_oracle_table
Generate Table
Watchdog value: 80.0
Depth 2 (size:3) (Time:0m0.23120s)
Depth 3 (size:21) (Time:0m0.23198s)
Depth 4 (size:574) (Time:0m0.26068s)
Depth 5 (size:400858) (Time:0m21.23231s)
Threshold reached, generation interrupted
Stop required
Depth 5 (size:5000002) (Time:4m52.56009s) [RAM:9.52Gb]
```
注意:生成过程非常消耗 RAM,``--watchdog`` 允许设置一个 RAM 百分比,超过该百分比将中断生成。
### 合成位向量表达式
然后我们可以尝试简化一个看似混淆的表达式:
```
from qsynthesis import SimpleSymExec, TopDownSynthesizer, InputOutputOracleLevelDB
blob = b'UH\x89\xe5H\x89}\xf8H\x89u\xf0H\x89U\xe8H\x89M\xe0L\x89E\xd8H\x8bE' \
b'\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0H\x8dH\x01H\x8b' \
b'E\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2H)\xd0H\x83\xe8' \
b'\x02H!\xc1H\x8bE\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0' \
b'H\x8dp\x01H\x8bE\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2' \
b'H)\xd0H\x83\xe8\x02H\t\xf0H)\xc1H\x89\xc8H\x83\xe8\x01]\xc3'
# 执行指令的符号执行
symexec = SimpleSymExec("x86_64")
symexec.initialize_register('rip', 0x40B160) # arbitrary address
symexec.initialize_register('rsp', 0x800000) # arbitrary stack
symexec.execute_blob(blob, 0x40B160)
rax = symexec.get_register_ast("rax") # retrieve rax register expressions
# 加载查找表
ltm = InputOutputOracleLevelDB.load("my_oracle_table")
# 执行表达式合成
synthesizer = TopDownSynthesizer(ltm)
synt_rax, simp = synthesizer.synthesize(rax)
print(f"expression: {rax.pp_str}")
print(f"synthesized expression: {synt_rax.pp_str} [{simp}]")
```
## 限制
* 合成准确性受限于预计算表的详尽程度
* 表生成受限于 RAM 消耗
* 重汇编不能涉及内存变量,目标必须是寄存器,且架构取决于 llvmlite *(因此主要是 x86_64)*
* 代码引用了基于跟踪的合成,该功能已被禁用*(因为底层框架尚未开源)*
## 作者
* Robin David (@RobinDavid), Quarkslab
## 贡献者
非常感谢对此研究做出贡献的人员:
* Luigi Coniglio
* Jonathan Salwan
标签:API安全, AST搜索, DNS 反向解析, IDA插件, JSON输出, Python, SMT求解器, Triton, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码去混淆, 位向量, 恶意代码分析, 无后门, 汇编指令, 灰盒测试, 白盒测试, 程序合成, 符号执行, 逆向工具, 逆向工程, 配置文件, 静态分析, 黑盒测试