侧边栏壁纸
博主头像
Gstory's Blog博主等级

每天进步一点点!

  • 累计撰写 108 篇文章
  • 累计创建 23 个标签
  • 累计收到 11 条评论

目 录CONTENT

文章目录

NDK开发之ollvm混淆

gstory
2022-03-23 / 0 评论 / 2 点赞 / 817 阅读 / 3446 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-10-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

简介

Obfuscator-LLVM 是 2010 年 6 月由 Yverdon-les-Bains 的瑞士西部应用科学与艺术大学 ( HEIG-VD ) 的信息安全小组发起的一个项目。
该项目的目的是提供LLVM编译套件的开源分支,能够通过代码混淆和防篡改提供更高的软件安全性。由于我们目前主要在中间表示(IR) 级别工作,因此我们的工具兼容所有编程语言(C、C++、Objective-C、Ada 和 Fortran)和目标平台(x86、x86-64、PowerPC、PowerPC-64 、ARM、Thumb、SPARC、Alpha、CellSPU、MIPS、MSP430、SystemZ 和 XCore)当前受 LLVM 支持。仓库地址,只不过仅更新到llvm的4.0,2017年开始就没在更新。
这里安装的是修改后的9.0.1版本,ndk使用20.0.5594570版本

下载

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 -DLLVM_INCLUDE_TESTS=OFF  ../obfuscator/
make -j8 #8是你的CPU线程数量 比如8核16线程可以写 -j16 

整合到Android NDK

编译完成之后,需要把我们编译的新的支持Ollvm的clang复制替换掉 AndroidStudio使用的NDK目录 中的对应文件。

我们编译目录 /build/bin下面 clang、clang-9、clang-format、clang++ 这四个文件,复制到 AndroidStudio使用的NDK目录 /toolchains/llvm/prebuilt/darwin-x86_64/bin,存在同名文件需要替换掉。

我们编译目录 /build/lib/clang/9.0.1/include下面 stdarg.h 、stddef.h 、__stddef_max_align_t.h 、float.h 这四个文件复制到 AndroidStudio使用的NDK目录 /toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include 文件夹下。

配置

在CMakeLists.txt文件中加入

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")

ollvm指令

控制流扁平化

这个模式主要是把一些if-else语句,嵌套成do-while语句

  • -mllvm -fla:激活控制流扁平化
  • -mllvm -split:激活基本块分割。在一起使用时改善展平。
  • -mllvm -split_num=3:如果激活了传递,则在每个基本块上应用3次。默认值:1

指令替换

这个模式主要用功能上等效但更复杂的指令序列替换标准二元运算符(+ , – , & , | 和 ^)

  • -mllvm -sub:激活指令替换
  • -mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。默认值:1

虚假控制流程

这个模式主要嵌套几层判断逻辑,一个简单的运算都会在外面包几层if-else,所以这个模式加上编译速度会慢很多因为要做几层假的逻辑包裹真正有用的代码。

  • -mllvm -bcf:激活虚假控制流程
  • -mllvm -bcf_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
  • -mllvm -bcf_prob=40:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30

其他

  • -mllvm -sobf 开启字符串混淆
  • -mllvm -seed=0xdeadbeaf 指定随机数种子生成器
2
NDK

评论区