简书链接:利用obfuscatorllvm对安卓平台so库进行混淆虚假流程,字符串混淆。
文章字数:563,阅读全文大约需要2分钟
使用第三方没啥难度,牛逼的还是这些 搞混淆 防止破解的人呐!!!
另外网上某些教程说的太麻烦复杂了,我都是直接下载孤挺花和obfuscator-llvm/一样的用法,编译之后替换bin目录的文件就行了,不需要那么复杂的改那么多东西,而且那么多复杂的步骤没缕清关系就要调到坑里面去了。
github https://github.com/obfuscator-llvm/obfuscator
1 2 3 4 5 6 7 8 9 10 11
| git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/ make -j7 //or cmake -DCMAKE_BUILD_TYPE:String=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/prebuilt/linux-x86_64目录下。
make -j5
|
编译大概需要30-90分钟。
编译完成之后在build目录会发现有很多文件,其中包含了bin文件,
我是把这整个目录覆盖到/ndk/toolchains/llvm
把build目录里的所有头文件也拷贝到自己项目中
目录结构
/lib/clang/4.0.1/include/
注意事项 升级cmake版本,
效果如下:
效果是卡成狗了, ida分析头疼了。

源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <string.h> #include <stdio.h> #include <stdlib.h>
__attribute((__annotate__(("fcf")))) __attribute((__annotate__(("fla")))) //模糊处理 __attribute((__annotate__(("icf")))) __attribute((__annotate__(("sbb")))) void test(){ int a=0; int b=1; printf("abcdefg %d ",a); }
void test1(){ int a=0; int b=1; printf("test1 %d ",a); } int main2(int argc, char** argv) { int a = atoi(argv[1]); if(a == 0) return 1; else return 10; return 0; }
void test21(){ int a=0; int b=1; printf("test22 %d ",a); }
int main(int argc, char** argv) { int a = atoi(argv[1]); if(a == 0) return 1; else return 10; return 0; }
|
android make
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libSecShell LOCAL_LDLIBS := -lm -llog LOCAL_SRC_FILES := test.c
define walk $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e))) endef $(warning localdir $(LOCAL_PATH)) LOCAL_C_INCLUDES+= $(call walk, ${LOCAL_PATH}/include) LOCAL_C_INCLUDES+=${LOCAL_PATH}/include/stddef.h $(warning LOCAL_C_INCLUDES $(LOCAL_C_INCLUDES)) #-mllvm -bcf 的子选项, 虚假控制流程 -mllvm -bcf_prob=40 模糊概率百分之40 -mllvm -bcf_loop=3 #LOCAL_CFLAGS := -mllvm -bcf -mllvm -boguscf-prob=100 -mllvm -boguscf-loop=1 -mllvm -sub -mllvm -fla -mllvm -perFLA=100
#-mllvm -fla -> -mllvm -split -mllvm -split_num=3 如果激活了传递,则在每个基本块上应用3次。默认值:1 #控制流扁平 ,虚假控制流. 控制流展评 https://github.com/obfuscator-llvm/obfuscator/wiki/Features LOCAL_CFLAGS += -mllvm -sub -mllvm -sub_loop=3 -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -bcf -mllvm -bcf_prob=90 -mllvm -bcf_loop=4 LOCAL_CPPFLAGS += -mllvm -sub -mllvm -fla -bcf -mllvm -bcf_prob=90 -mllvm -bcf_loop=3 include $(BUILD_SHARED_LIBRARY) # __attribute((__annotate__(("fla")))); 模糊处理某个函数.
|

字符串混淆
字符串混淆用孤挺花的
混淆后f5发现字符串已经不见了。。破解难度加大了。

字符串混淆的代码地址
https://github.com/GoSSIP-SJTU/Armariris