ollvm
- 什么事ollvm是基于LLVM(Low Level Virtual Machine)的一个开源混淆器,包含三大核心混淆手段指令替换、虚假控制流、控制流平坦化
指令替换
-
原理:是一种通过数学等价变换来增加代码复杂度的混淆技术。它的核心思想是将程序中原本简单的指令(如加法、异或),替换为一段功能等效但逻辑极其晦涩的指令序列
-
手段:采用了**MBA(Mixed Boolean-Arithmetic,混合布尔算术)**表达式,就是将基本运算用位运算代替让代码变得很丑
-
对抗:
- D-810直接去
- D-810做不出来的用GAMBA再等价替换
-
实例:极客大挑战week4的obfuscat3_revenge
控制流平坦化 FLA
-
原理:个人理解就是将原本函数的传递关系全部打碎,再统一组织。原来的跳转是一个函数跳到另一个函数,而现在是统一跳回分发器函数,再由状态变量决定跳入哪个函数,函数或者真实块的下一步调用取决的是状态变得的值。
-
核心组件:理解了上面的原来下面的组件就都清楚了
- 序言 (Prologue) :
函数的入口。它的核心任务是初始化状态变量 (State Variable) ,例如
state = START_KEY。 - 主分发器 (Main Dispatcher) :
混淆的心脏。通常是一个巨大的
while(true) 循环,内部包裹着switch(state)。它不断读取当前状态值,决定下一个要执行哪个块。 - 子分发器 (Sub-Dispatcher) (变种) : 更复杂的 FLA 会嵌套多层 switch,或者使用数学公式计算跳转目标,进一步隐藏状态转移关系。
- 真实块 (Relevant Blocks) : 包含原始业务逻辑的代码块。它们不再直接跳转到下一个真实块,而是被“隔离”成了 switch 的一个个 case。
- 预处理块 (Predispatcher) / 状态更新:
每个真实块执行完后,不会直接跳转。而是通过更新
state 变量(例如state = NEXT_KEY),然后无条件跳转回主分发器,由分发器在下一轮循环中根据新状态进行调度。 - 返回块 (Return) : 函数的出口,当状态变量达到特定值时,跳出循环并返回。
- 序言 (Prologue) :
函数的入口。它的核心任务是初始化状态变量 (State Variable) ,例如
-
对抗
- 直接静态看,之前院ctf的一道题当时不知道这个就直接看逻辑,也是能复原出来的,但是很费时间和脑子。不理解可以直接按照伪代码模拟一遍,搞完就清楚控制流平坦化了
- D-810直接去
-
实例:院cft:easyre,标准控制流平坦化D-810直接秒
虚假控制流
-
原理 是 OLLVM 通过向代码中注入永远不会执行的“死代码”块和难以预测的条件跳转,来干扰控制流图(CFG)分析的一种混淆技术。
- 不透明谓词 (Opaque Predicate) :
- 这是一个在编译时或运行时其值已知,但对于静态分析工具(如 IDA)而言看似未知的条件表达式。
- 示例:
if (x * (x + 1) % 2 != 0) { ... }。数学上任意整数 x,其 x(x+1) 必然是偶数,因此条件永远为假。但 IDA 在不进行深度代数分析的情况下,会认为这是一条合法的分支。
- 不可达块 (Unreachable Block) :
- 由永假的不透明谓词保护的代码块。由于条件永远不满足,这些代码在实际运行时永远不会执行,但在静态反编译时会生成大量干扰逻辑,极大地增加了分析工作量。
- 不透明谓词 (Opaque Predicate) :
-
对抗:
- D-810
- 全局变量修改段属性与初始值
- 定位变量
- 修改段属性:Alt+s打开段编辑窗口,选择”Read-only“或者去掉”Write“
- 赋予这些变量初值
- 在相关段按D,在F5
字符串加密
没践过,就直接引用大佬的文章:[原创]深入浅出 Ollvm 混淆原理及反混淆技术-Android安全-看雪安全社区|专业技术交流与安全研究论坛
(1)特征搜索
一般在so中可以直接搜索datadiv_decode,一般很多编写解密函数进行操作是这个函数,针对这种情况,一般可以通过frida hook就可以拿到解密后的值,然后进行patch
(2)init_array中解密
字符串解密操作在init_arrray中进行,一般可以通过模拟执行init_array,然后将解密后的字符串全部保存下来
(3)jni_onload解密
在jni_onload函数中进行解密操作,这时候就要进行inlinehook拿到解密后寄存器的值,也可以进行hook,也可以使用unicorn进行操作
后记
感觉还是要通过题目来理解,指令替换和控制流平坦化通过几个小例题理解更深刻了,字符串加密和虚假控制流感觉就一般