OLLVM环境搭建(转)
版权声明:本文为CSDN博主「何胥」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38244174/article/details/82889725
目前市面上的许多安全公司都会在保护IOS应用程序或安卓APP时都会用到OLLVM技术。譬如说顶象IOS加固、网易IOS加固等等。故而我们今天研究下OLLVM是个什么。将从(1)OLLVM是什么?OLLVM与LLVM的关系;(2)OLLVM的三大功能;(3)OLLVM的配置过程;(4)OLLVM源码分析。(4)OLLVM使用四个方面进行说明。
(一)OLLVM是什么?
OLLVM是一款是由瑞士西北科技大学开发的一套开源的针对LLVM的代码混淆工具,旨在加强逆向的难度,整个项目包含数个包含独立功能的LLVM Pass,每个Pass会对应实现一种特定的混淆方式,这些Pass将在后面进行细说,通过这些Pass可以改变源程序的CFG和源程序的结构。后期转向商业项目strong.protect。Github目前已支持OLLVM-4.0.
与此同时,LLVM与OLLVM最大的区别在于混淆Pass的不同。混淆Pass作用于LLVM的IR中间语言,通过Pass混淆IR,最后后端依据IR生成的目标语言也会得到相应的混淆。得益于LLVM的三段式结构,即前端对代码进行语法分析词法分析形成AST并转换为中间IR语言,一系列优化Pass对IR中间语言进行优化操作,或混淆,或分析,或改变IR的操作码等等。最终在后端解释为相应平台嘚瑟机器码。OLLVM支持LLVM所支持的所有前端语言:C,C++,Objective-C,Fortran等等和LLVM所支持的所有目标平台:x86,x86-64,PowerPC,PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ, 和 XCore。
(二)OLLVM的三大功能
OLLVM有三大功能,分别是:Instructions Substitution(指令替换)、Bogus Control Flow(混淆控制流)、Control Flow Flattening(控制流平展)。
Github上也有OLLVM每个功能详细的介绍和举例:https://github.com/obfuscator-llvm/obfuscator/wiki/Features。操作指令可以是一个或多个参数。
(1)指令替换功能:随机选择一种功能上等效但更复杂的指令序列替换标准二元运算符;适用范围:加法操作、减法操作、布尔操作(与或非操作)且只能为整数类型。
(2)混淆控制流功能:1.在当前基本块之前添加基本块来修改函数调用图。2.原始基本块也被克隆并填充随机选择的垃圾指令。
(3)控制流平展功能:目的是完全展平程序的控制流程图。我自己的理解是if...else变为switch..case..语句。
(三)OLLVM环境搭建:
OLLVM版本号:OLLVM 4.0;Ubuntu环境:Ubuntu16.04;虚拟机中处理器数量为4个、运行内存3G,分配硬盘空间50g。
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 #多线程,如果make出现问题,可去掉-j7使用单线程编译
若是git clone一直失败,下不下来,尝试:
git config --global http.postBuffer 20000000
若是cmake时一直报错,则将cmake那句替换为:
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
若是make时时间太长,则重新cmake后,多分配一些内存和处理器。
(四)OLLVM保护命令
指令替换功能:
'/home/mrh929/Desktop/ollvm/build/bin/clang' -emit-llvm test.c -mllvm -sub -S -o testsub.ll
'/home/mrh929/Desktop/ollvm/build/bin/clang' test.c -mllvm -sub -o test
控制流平坦化功能 :
'/home/mrh929/Desktop/ollvm/build/bin/clang' -emit-llvm test.c -mllvm -fla -S -o testfla.ll
'/home/mrh929/Desktop/ollvm/build/bin/clang' test.c -mllvm -fla -o test
混淆控制流功能 :
'/home/mrh929/Desktop/ollvm/build/bin/clang' -emit-llvm test.c -mllvm -bcf -S -o testfla.ll
'/home/mrh929/Desktop/ollvm/build/bin/clang' test.c -mllvm -bcf -o test