背景
在项目中有使用jni实现功能,编译最终包是时候ollvm混淆so中逻辑。在macOS中编译出混淆的so。
环境:
1 2 3 4
| macOS 12.6 Intel x86_64 ndkVersion "21.4.7075529" cmake version 3.18.0 Android Studio Chipmunk | 2021.2.1 Patch 2
|
编译ollvm
默认ndk中clang-ollvm是没有带混淆的,需要我们自己编译一次。
仓库地址:https://github.com/heroims/obfuscator
选择分支llvm-9.0.1
完整命令:
1
| https://github.com/heroims/obfuscator.git -b llvm-9.0.1
|
找一个目录下载,大概500m这样。
1 2
| ~/android/hook/llvm obfuscator
|
在llvm目录中创建一个build目录
1 2 3 4 5 6 7 8
| ~/android/hook/llvm mkdir build cd build # 执行初始化配置 cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON ../obfuscator/ # 这里需要等一段时间,等配置完成,继续执行以下命令 make -j6 # 线程数量根据自己的电脑配置来选择。
|
假设你的电脑没有安装cmake上面的命令是会not found。
下载cmake:https://cmake.org/files/v3.18/
这个文件:cmake-3.18.0-Darwin-x86_64.dmg
下载完成双击安装。
打开软件:
选择菜单中Tools,How to Install For Command Line Use
1 2 3 4 5
| # 复制这个命令,放到终端中执行,输入密码,安装完成。 sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install # 完成后,直接cmake --version会显示当前环境中的版本信息 cmake --version cmake version 3.18.0
|
执行上面编译命令,我的电脑大概40分钟。
配置ollvm
编译成功后需要把build/bin目录中的clang-9和clang-fromat2个文件复制出来。
build/lib/clang/9.0.1/include目录中的__stddef_max_align_t.h,float.h,stdarg.h,stddef.h,stdbool.h也复制出来。
复制一份clang-9,第一份重命名clang,第二份重命名clang++。
需要复制的文件结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ├── build │ └── bin │ ├── clang │ ├── clang++ │ └── clang-format └── lib └── clang └── 9.0.1 └── include ├── __stddef_max_align_t.h ├── float.h ├── stdarg.h ├── stdbool.h └── stddef.h
|
把bin目录的3个文件复制到~/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin,这是我的电脑的ndk目录,覆盖之前文件(覆盖前请备份)根据自己电脑情况做修改。
把include目录下5个文件复制到~/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include下。编译使用了property系统的头文件读取系统属性,会遇到stdbool.h缺失,这个也必须复制过去。
Android Studio配置ndk
build.gradle(app)配置ndk版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| android { compileSdk 32 // 使用这个21版本编译项目 ndkVersion "21.4.7075529" defaultConfig { applicationId "com.cat.stalker" externalNativeBuild { cmake { abiFilters 'arm64-v8a' cppFlags "-std=c++14 -fexceptions -fvisibility=hidden" cppFlags "-mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -sobf" } } ndk { abiFilters "arm64-v8a" } }
|
配置混淆参数,设置编译架构。之前frida stalker的简单测试的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| extern "C" JNIEXPORT jstring JNICALL Java_com_cat_stalker_MainActivity_stringFromJNI( JNIEnv *env, jobject ) { std::string hello = "Hello from C++\n author: "; hello += get_author(); hello += "\ndesc: "; hello += get_author_desc(); for (int i = 0; i < 20; ++i) { if (i % 3) { hello += get_author(); } else if (i % 5) { hello += get_author_desc(); } else { hello += get_age(i); } } return env->NewStringUTF(hello.c_str()); }
|
clean一次项目,重新编译。把得到的so放到ida中,未加混淆:
配置ollvm后
有需要编译后的clang和头文件的,在安全后厨星球获取。
欢迎关注公众号:黄大官AOSP
参考:
https://blog.csdn.net/u013314647/article/details/117740784