ollvm - 基于LLVM重打包反OLLVM

ollvm有很多种方法去除,其中ollvm老是生成那种没什么鸟用的分支跳转,无论是用unidbg/unicorn去trace还是做上下文收集把无用分支跳转nop掉(部分分支永远跑不通),都无法解决ollvm的问题。

这个时候github老是给我推送什么把二进制文件翻译成LLVM-IR的奇怪文章,这个不是最主要的点,众所周知LLVM在编译IR的时候会进行优化(如:去除无效指令什么的),这个时候一个一键的去除ollvm混淆的工具就有了雏形,但是呢,这个去除貌似不是特别智能。

在我的测试中,不是所有的分支他都会删掉,只有那种冗余的连跳两次的分支跳转才会被剔除,这也大大简化了代码流程,虽然和源代码依旧有出入,但是至少流程图从一块平地变成了一个飞机场

引入项目

这个时候得掏出一个大宝贝!retdec

RetDec是一个基于LLVM的可重定向机器代码反编译器。

反编译器不限于任何特定的目标架构、操作系统或可执行文件格式:

支持的文件格式:ELF、PE、Mach-O、COFF、AR(存档)、Intel HEX 和原始机器代码

支持的体系结构:

32 位:Intel x86、ARM、MIPS、PIC32 和 PowerPC

64 位:x86-64、ARM64(AArch64)

特征:

  • 对可执行文件进行静态分析,并附带详细信息。

  • 编译器和打包程序检测。

  • 加载和指令解码。

  • 基于签名的静态链接库代码删除。

  • 调试信息(DWARF、PDB)的提取和利用。

  • 检测和重建 C++ 类层次结构 (RTTI、vtables)。

  • 从 C++ 二进制文件 (GCC、MSVC、Borland) 中解析符号。

  • 功能、类型和高级结构的重建。

  • 集成反汇编程序。

  • 以两种高级语言输出:C 和类似 Python 的语言。

  • 生成调用图、控制流图和各种统计数据。

开始测验

需要注意retdec在生成出来的可能和原来的代码不一致而导致无法编译!又或者因为ll文件的语法错误无法编译!如果您是从qsign过来研究的开发人员,建议采用将dynarmic生成的JIT缓存到磁盘的做法以加快速度,同时需要注意simple-x86的检测!