安卓使用OLLVM混淆.so
编译OLLVM
git clone https://github.com/heroims/obfuscator.git -b llvm-9.0.1 --depth 1
cd obfuscator
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
编译好后从build/bin/
目录把下面几个文件拷贝到/toolchains/llvm/prebuilt/linux-x86_64/bin/
clang
,clang++
,clang-9.0
,clang-format
把以下几个文件从build/include/
拷贝到/sysroot/usr/include/
Stdarg.h
,Stddef.h
,__stddef_max_align_t.h
,float.h
,stdbool.h
命令和编译选项简介
-
fla:控制流扁平化;该选项使用函数级别的混淆来隐藏程序的结构。这通过随机重命名函数、添加不必要的控制流和删除调用的函数来实现。
这个模式主要是把一些if-else语句,嵌套成do-while语句,增加了反编译和分析代码的难度。-mllvm -fla
:激活控制流扁平化 -
split:该选项使用控制流混淆来增加程序的复杂性。这通过将函数分成几个基本块、添加随机的跳转指令和在运行时随机重组这些基本块来实现。这使得代码的流程更难以跟踪,从而增加了破解和反编译的难度。
-mllvm -split
:激活基本块分割。在一起使用时改善展平。
-mllvm -split_num=3
:如果激活了传递,则在每个基本块上应用3次。默认值:1 -
sub:指令替换;该选项使用字符串混淆来隐藏代码中的常量字符串。这通过将字符串分成几个小块、将其存储在数组中并在运行时重新组合来实现。
这个模式主要用功能上等效但更复杂的指令序列替换标准二元运算符(+ , – , & , | 和 ^),使得分析代码和查找敏感信息更加困难。-mllvm -sub
:激活指令替换
-mllvm -sub_loop=3
:如果激活了传递,则在函数上应用3次。默认值:1 -
bcf:虚假控制流程;该选项使用基本块级别的混淆来隐藏代码的结构。这通过改变基本块之间的控制流、添加不必要的基本块和移除基本块之间的条件分支来实现。这个模式主要嵌套几层判断逻辑,一个简单的运算都会在外面包几层if-else,所以这个模式加上编译速度会慢很多因为要做几层假的逻辑包裹真正有用的代码。
另外说一下这个模式编译的时候要浪费相当长时间包哪几层不是闹得!
-mllvm -bcf
:激活虚假控制流程
-mllvm -bcf_loop=3
:如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf_prob=40
:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30 -
sobf:源代码混淆;该选项使用源代码混淆技术来隐藏代码的逻辑和结构。这通过使用类似加密的方式对代码进行变换,使其难以理解和分析。这可以通过运行时解密来执行,从而隐藏代码的真实功能。
变量名混淆:将变量名更改为随机字符串,使其难以理解。
控制流混淆:改变代码的控制流程,增加条件分支和跳转,使代码更难以分析。
字符串加密:将字符串加密,以防止明文字符串在二进制文件中可见。
函数名混淆:将函数名更改为随机名称,增加代码的复杂性。-mllvm -sobf
:激活源代码混淆
-mllvm -aesSeed=0xada46ab5da824b96a18409c49dc91dc3
:用于为 AES 加密提供一个种子值,从而生成随机数以增加混淆的难度。这有助于保护软件免受逆向工程的攻击,因为它会使得分析混淆后的代码更加困难。
单个函数混淆:
__attribute((__annotate__("bcf")))
__attribute((__annotate__("fla")))
__attribute((__annotate__("sub")))
__attribute((__annotate__("split")))
__attribute((__annotate__("sobf")))