ARM64 OLLVM反混淆之虚假控制流
2023-7-14
| 2023-7-14
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
Jul 14, 2023 03:40 AM

虚假控制流介绍

虚假控制流(Bogus Control Flow)是一种代码混淆技术,其主要目的是增加代码的复杂度,使得反编译和逆向工程变得更加困难。虚假控制流技术的基本思想是在代码中插入不会被执行的死代码分支,这些死代码分支是原来代码的拷贝,但是通过不透明谓词的方式隐藏起来,从而达到欺骗逆向工具的目的。 不透明谓词(Opaque Predicate)是指在程序中具有条件判断的语句,但其条件判断的结果在静态分析阶段难以确定。换句话说,不透明谓词是一种具有模糊语义的条件判断,使得静态分析工具难以准确地推断出其执行路径。不透明谓词通常是为了增加代码的混淆性和逆向工程的困难度而被引入的。通过使用不透明谓词,可以使程序的控制流路径变得更加复杂,使得逆向工程师无法轻易地理解程序的逻辑和执行流程。

第一种虚假控制流与反混淆

这种类型的虚假控制流相关的全局变量在 .bss 段,而且其值恒为0。
该函数包含 dword_13043C、dword_130404 两个 .bss 段变量,经过交叉引用查看,该两变量只有读取,没有写入,所以它们的值恒定为0,针对此,我们可以将它们从内存加载值的LDR语句直接修改为 MOV #0,从而让IDA的F5反汇编恢复正常。
 
下面脚本针对 ARM64 程序,使用 keystone 来生成 patch 代码。
通过 find_suspicious_opaque_predicate 函数可以找出 bss 段所有只有读取没有写入的变量,可以通过分析打印出来的地址来找出一个内存段(通常不透明谓词相关的全局变量都连在一起),然后循环调用 do_debcf 对一个地址进行 patch 修改。
注意:不透明谓词涉及的全局变量是只有读取没有写入,但是只有读取没有写入的全局变量不一定是不透明谓词用到的。
处理后的效果:
notion image
TODO:之后遇到的虚假控制流会继续在本文更新
 
  • LLVM
  • 反混淆
  • 逆向
  • ARM64内核研究(五)NDK加载 LLVM Pass 方案
    • Giscus
    目录