使用 OLLVM 混淆代码

2020年8月26日 · 521 字 · 2 分钟 · OLLVM

操作环境:

  • macOS Catalina (10.15.6)
  • NDK(r18b)

由于网上的资料大多年久失修,所以这里也只是更新一下操作,并没有什么新奇的事情。

OLLVM 简介

OLLVM(Obfuscator-LLVM) 是瑞士西北应用科技大学安全实验室于 2010 年 6 月份发起的一个项目,该项目旨在提供一套开源的针对 LLVM 的代码混淆工具,以增加对逆向工程的难度。

配置

下载编译

git clone https://github.com/heroims/obfuscator.git
cd obfuscator
git checkout llvm-9.0.1

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON ../
make -j7

NDK 集成

cp -r $ANDROID_NDK_HOME/toolchains/llvm $ANDROID_NDK_HOME/toolchains/ollvm-9.0.1
rm -rf $ANDROID_NDK_HOME/toolchains/ollvm-9.0.1/prebuilt/darwin-x86_64/bin
rm -rf $ANDROID_NDK_HOME/toolchains/ollvm-9.0.1/prebuilt/darwin-x86_64/lib64
cp -r build/bin $ANDROID_NDK_HOME/toolchains/ollvm-9.0.1/prebuilt/darwin-x86_64/
cp -r build/lib $ANDROID_NDK_HOME/toolchains/ollvm-9.0.1/prebuilt/darwin-x86_64/

修改 $ANDROID_NDK_HOME/build/core/default-build-commands.mk 文件为以下内容:

# LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,llvm)
# LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

OLLVM_NAME := ollvm-9.0.1
LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(OLLVM_NAME))
LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

使用说明

-mllvm -fla:激活控制流扁平化
-mllvm -split:激活基本块分割。在一起使用时改善展平。
-mllvm -split_num=3:如果激活了传递,则在每个基本块上应用3次。默认值:1
-mllvm -sub:激活指令替换
-mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf:激活虚假控制流程
-mllvm -bcf_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf_prob=40:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30
-mllvm -sobf:编译时候添加选项开启字符串加密
-mllvm -seed=0xdeadbeaf:指定随机数生成器种子

项目中的配置

Android.mk 中添加混淆编译参数

LOCAL_CFLAGS += -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf

参考