AntiOllvm
去除二进制文件 Ollvm
混淆,并生成新的可执行二进制文件
其它方法介绍
- Ollvm 已经开源很久了,现在市面很多恶意软件都使用它,为了防止分析加壳加混淆基本是必备的。假如一个恶意软件使用某种算法加密了你的文件,并且采用了混淆,如果你要自己解密或者制作解密工具都离不开分析它的算法。而使用混淆后伪代码几乎不可查看,为此你要付出大量的时间和精力去分析。现在网上通用一点的方法有使用
unicorn
模拟执行,还有使用trace
功能跟踪运行过的代码。 - 使用
unicorn
模拟执行- 虽然可以支持很多架构的运行,但是从汇编层构建出
CFG
还是比较吃力的 - 具体的分析都对应着直接的汇编指令,再加上多架构这样处理起来非常麻烦
- 还有修复跳转,补丁指令,在原函数中代码分散,甚至还需要修复指令的重定位
- 虽然可以支持很多架构的运行,但是从汇编层构建出
- 使用
trace
跟踪trace
分析相对较简单,但缺点是你需要在真机上运行- 每次运行也不一定会覆盖所有路径
- 在还原算法或分析时看的是汇编指令,增加分析难度
AntiOllvm 简介
- 采用将二进制代码还原为
LLVM IR
的方式,经过各种优化去除混淆后再编译回原文件 - 采用这种方案优点很多
- 本身
Ollvm
就是在LLVM IR
中转换代码然后编译,在还原回LLVM IR
后能最大限度的还原特征 - 可以利用现有的
LLVM
中的优化,各种分析也可以查找部分现成的 - 统一了所有架构的分析,分析方法通用,重建 CFG 非常容易
- 分析过程更加直观,不接触汇编代码,更容易分析出混淆规则
- 本身
大概思路
AntiOllvm
使用 retdec 将二进制文件还原为LLVM IR
- 使用
LLVM
中的内部优化,将IR
码优化为较高可读性的代码,这期间部分指令替换以及不可达代码就已经优化掉了 - 定制
Pass
去除掉函数内部的 虚假控制流和平坦化 - 最后通过
LLVM
将代码重新编译回汇编并回填文件
开发进度
架构 | ELF | COFF | Mach-O |
---|---|---|---|
Arm | Yes | ||
Arm64 | |||
X86 | |||
X86_64 |
- 等测试稳定会后陆续开放其它架构
- IDA 插件的开发(需等所有架构开放后)
使用说明
- 该项目是收费项目,AntiOllvm仓库只会存放说明文件和一些测试样本的源码和二进制文件
- 目前还未提供可购买版本,鉴于目前不够稳定,样本量较少,后续稳定后会推出正式可购买版本
- 欢迎大家提供样本(越复杂越好)到我的邮箱 beichenzhizuoshi@163.com,也可在本仓库提交 issues 附带样本及说明,目前只接受
Arm
架构的ELF
样本,发送样本时请在标题上注明 二进制架构及文件格式 例如 Arm-ELF 测试样本, 内容上注明被混淆的 函数名称或地址,和你自认为的 混淆难度等级(1-3),我会在去混淆通过后回复你去混淆后的二进制文件
例子演示
- 见 AntiOllvm,在这个仓库会公布文档和一些测试的源码以及去混淆后的二进制文件
- 该样本是使用
openssl
加密库,开启混淆,注意测试与MD5
算法有关方法MD5_Update
、md5_block_data_order
,样本详细说明可以查看仓库 OpenSSLTest - 未混淆和去混淆后的运行对比
- 混淆过后的
MD5_Update
CFG
- 混淆过后的
md5_block_data_order
CFG
- 未混淆
MD5_Update
CFG
如下: - 去混淆后
MD5_Update
CFG
- 未混淆
md5_block_data_order
CFG
- 去混淆后
md5_block_data_order
CFG
问题交流
- 请关注下方微信公众号后获取入群提示