zl程序教程

您现在的位置是:首页 >  Python

当前栏目

安卓JNI-OLLVM混淆

2023-03-15 22:05:40 时间

LLVM是编译器的框架系统,OLLVM(Obfuscator-LLVM):混淆JNI文件的一种工具

OLLVM源码 : https://github.com/heroims/obfuscator/tree/llvm-8.0

控制流平坦化 平坦化是来重组原始代码执行流程,把原本易于阅读的代码流程重组成一个switch case形式的执行流程,所以被混淆的函数具有异常的控制流。

指令替换 使用功能上等效但更复杂的指令序列替换标准二元运算符(+ , – , & , | 和 ^)

虚假控制流程 这个模式主要嵌套几层判断逻辑,一个简单的运算都会在外面包几层if-else。

OLLVM反混淆 反混淆需要解决以下几个问题:

  • 找出流程里所有的相关块,确定哪些是分发控制块和真实逻辑块
  • 确定各个真实块的前后顺序与关系
  • 将真实块用跳转(B,BNE等跳转指令)连接起来

确定分发控制块 观察白色的块,其实特征非常明显,非常短(只有几条指令),仅仅只有寄存器的操作,而没有内存操作,最后都是cmp+跳转等等,这个不同厂商的混淆有细微的差别,但多数都特征非常明显,可以直接静态分析出来,在反混淆程序设计上,为了隔离这种差别引起的复杂性,可以用多态隔离掉就可以了。确定所有控制块后,直接用0清除这些块里面所有指令,免得干扰ida分析,因为修复成功后,所有真实块都不会经过这些控制块了。

确定真实逻辑块的前后关系 单从静态分析去确定真实块的关系非常浪费时间,这里可以采取两种方法 IDA动态调试,使用trace断点记录目标函数执行路径 模拟执行目标函数,并记录执行路径