OLLVM环境搭建-编译x86指令集可执行程序-Ubuntu 20.04
总耗时两周成功搭建OLLVM,越坑无数,记录一下过程。
主要参考:
跟着铁头干混淆2 ubuntu20.04 编译 ollvm4.0 - 移动安全王铁头 - 博客园 (cnblogs.com)
能找到的资料中,对OLLVM的搭建大多依赖于NDK去编译so文件,我的目的是编译x86指令集可执行文件。
相关工具的版本信息如下:
下载 ollvm 4.0代码
git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
参考教程,需要对源码进行修改
ollvm目录/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h
690行char修改为uint8_t,参考教程中写错成uint_8
690 Expected<std::vector<uint8_t>> readMem(char *Dst, JITTargetAddress Src, uint64_t Size) { // Check for an 'out-of-band' error, e.g. from an MM destructor. if (ExistingError) return std::move(ExistingError); return callB<ReadMem>(Src, Size); }
之后在源码文件的同级目录下
mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/ make -j7
make -j7 在编译过程中反复出现虚拟机卡死情况,在多种尝试后确定问题是因为编译中的内存不够
需要增加交换分区,在实验中增加了4G的swap,主要参考是 如何在Ubuntu上增加swap交换空间_Linux教程_Linux公社-Linux系统门户网站 (linuxidc.com)
耗时两周最终100%编译成功
后续的过程不再配置NDK,直接在bin目录下编译源程序即可。
网上的资料中大多给出的使用方法是:
1、控制流扁平化
clang -mllvm -fla test.c -o test1
2、指令替换
clang -mllvm -sub test.c -o test2
3、控制流伪造
clang -mllvm -bcf test.c -o test
而我会报错:
该错误网上找不到解决办法,在github项目的提问中最终发现蛛丝马迹
解决方法为:
在bin目录下应该这样编译程序:
./clang -mllvm -fla test.c -o test1
将clang作为一个程序执行即可成功完成混淆