windows上编译ollvm4.0并集成到ndk中
说一下我的艰辛历程,整整编译了三四天,要么编译出来不能用,要么编译不了。。。。。。
工具
- mingw64:gcc编译器的windows版本
- ollvm4.0:官方版
- ndk:android studio中下载的ndk 16.1.4479499
设置环境
- 下载mingw64编译后的压缩包,下载链接:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
- 解压后设置环境变量
mingw64的bin目录中包含了gcc.exe,mingw32-make.exe等文件,命令行gcc --version
查看gcc的版本,验证环境变量是否设置完成。
- 最后一步将mingw32-make.exe文件更名为make(网上后很多人最后编译直接使用make命令,实际make命令就是这个文件,也可以不用更名直接使用migw32-make命令)
编译ollvm4.0
ollvm4.0下载链接:https://github.com/obfuscator-llvm/obfuscator
mkdir build //在ollvm解压的后的文件夹中生成build文件夹
cd build //进入到build文件夹中
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ../ //生成MinGW 的makefile工程文件
make //即开始编译(1个小时左右)
编译时可能会出现如下报错,将Expected<std::vector<char>> readMem(char *Dst, JITTargetAddress Src, uint64_t Size)
修改为Expected<std::vector<uint8_t>> readMem(char *Dst, JITTargetAddress Src, uint64_t Size)
error: could not convert '((llvm::orc::remote::OrcRemoteTargetClient<ChannelT>*)this)->callB<llvm::orc::remote::OrcRemoteTargetRPCAPI::ReadMem>(Src, Size)' from 'Expected<vector<unsigned char,allocator<unsigned char>>>' to 'Expected<vector<char,allocator<char>>>'
将ollvm4.0集成到android studio的ndk中
- 实现备份对应版本的ndk文件夹
- 将编译后的build\bin文件夹中的
clang.exe clang++.exe clang-format.exe
复制到ndk的toolchains\llvm\prebuilt\windows-x86_64\bin文件夹下,覆盖目标文件 - 将编译后的build\lib\clang\4.0.1\include文件夹中的
__stddef_max_align_t.h stddef.h stdarg.h float.h
复制到ndk的sysroot\usr\include文件夹下
使用ollvm对程序代码进行混淆
在android studio的local.properties文件中设置ndk 的路径
然后在build.gradle中设置-mllvm -fla -mllvm -sub -mllvm -bcf
,分别开启控制流平坦化,指令替换,伪造虚假执行流。
需要开启相应混淆功能的函数需要如下进行声明,例如函数开启控制流平坦化混淆。
开启混淆后函数的CFG控制流程图如下
参考链接:
https://www.cnblogs.com/zhangshenghui/p/12001739.html
https://blog.csdn.net/qq_42237638/article/details/104905061