安卓JNI-OLLVM混淆
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断点记录目标函数执行路径
模拟执行目标函数,并记录执行路径
文章来源: blog.csdn.net,作者:考古学家lx,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_43582101/article/details/108192760
- 点赞
- 收藏
- 关注作者
评论(0)