Ollvm初步学习笔记

ollvm

  • 什么事ollvm是基于LLVM(Low Level Virtual Machine)的一个开源混淆器,包含三大核心混淆手段指令替换、虚假控制流、控制流平坦化

指令替换

  • 原理:是一种通过数学等价变换来增加代码复杂度的混淆技术。它的核心思想是将程序中原本简单的指令(如加法、异或),替换为一段功能等效但逻辑极其晦涩的指令序列

  • 手段:采用了**MBA(Mixed Boolean-Arithmetic,混合布尔算术)**表达式,就是将基本运算用位运算代替让代码变得很丑

  • 对抗

    • D-810直接去
    • D-810做不出来的用GAMBA再等价替换
  • 实例:极客大挑战week4的obfuscat3_revenge

控制流平坦化 FLA

  • 原理:个人理解就是将原本函数的传递关系全部打碎,再统一组织。原来的跳转是一个函数跳到另一个函数,而现在是统一跳回分发器函数,再由状态变量决定跳入哪个函数,函数或者真实块的下一步调用取决的是状态变得的值。

  • 核心组件:理解了上面的原来下面的组件就都清楚了

    1. 序言 (Prologue) : 函数的入口。它的核心任务是初始化​状态变量 (State Variable) ​,例如 state = START_KEY
    2. 主分发器 (Main Dispatcher) : 混淆的心脏。通常是一个巨大的 while(true)​ 循环,内部包裹着 switch(state)。它不断读取当前状态值,决定下一个要执行哪个块。
    3. 子分发器 (Sub-Dispatcher) (变种) : 更复杂的 FLA 会嵌套多层 switch,或者使用数学公式计算跳转目标,进一步隐藏状态转移关系。
    4. 真实块 (Relevant Blocks) : 包含原始业务逻辑的代码块。它们不再直接跳转到下一个真实块,而是被“隔离”成了 switch 的一个个 case。
    5. 预处理块 (Predispatcher) / 状态更新: 每个真实块执行完后,不会直接跳转。而是通过更新 state​ 变量(例如 state = NEXT_KEY),然后无条件跳转回主分发器,由分发器在下一轮循环中根据新状态进行调度。
    6. 返回块 (Return) : 函数的出口,当状态变量达到特定值时,跳出循环并返回。
  • 对抗

    • 直接静态看,之前院ctf的一道题当时不知道这个就直接看逻辑,也是能复原出来的,但是很费时间和脑子。不理解可以直接按照伪代码模拟一遍,搞完就清楚控制流平坦化了
    • D-810直接去
  • 实例:院cft:easyre,标准控制流平坦化D-810直接秒

虚假控制流

  • 原理 是 OLLVM 通过向代码中注入永远不会执行的“死代码”块和难以预测的条件跳转,来干扰控制流图(CFG)分析的一种混淆技术。

    1. 不透明谓词 (Opaque Predicate)
      • 这是一个在编译时或运行时其值已知,但对于静态分析工具(如 IDA)而言看似未知的条件表达式。
      • 示例if (x * (x + 1) % 2 != 0) { ... }。数学上任意整数 x,其 x(x+1) 必然是偶数,因此条件永远为假。但 IDA 在不进行深度代数分析的情况下,会认为这是一条合法的分支。
    2. 不可达块 (Unreachable Block)
      • 由永假的不透明谓词保护的代码块。由于条件永远不满足,这些代码在实际运行时永远不会执行,但在静态反编译时会生成大量干扰逻辑,极大地增加了分析工作量。
  • 对抗

    • 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进行操作

后记

感觉还是要通过题目来理解,指令替换和控制流平坦化通过几个小例题理解更深刻了,字符串加密和虚假控制流感觉就一般

使用 Hugo 构建
主题 StackJimmy 设计