Window10下编译OLLVM的姿势
Angulu Lv1

前言

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室,移植了LLVM并且改进的一个项目obfuscator-LLVM,但是很久没有更新了,所以后续我选择的是github里面稍微比他新一点的分支goron进行使用。

Window环境搭建(2021年07月27号)

Window下编译OLLVM最让人抓狂的就是环境问题,还有就是一些环境产生的语法问题,标题之所以标上日期,是为了给大家参考的同时,看一下编译成功的时候,考虑当时各个环境的版本和其他问题。

cmake 安装配置
  • 安装
    cmake官网下载地址下载地址,在这里选择下载一个自己对应平台的二进制包安装就可以了,我这里下载的是 cmake-3.21.0-windows-x86_64.msi 这个包。
  • 配置
    为了在window上任何地方方便使用,我们配置上环境变量
    1、 新建环境变量:CMAKE_HOME=”你的安装目录到bin目录”.
    2、添加%CMAKE_HOME%到Path中即可.
  • 校验
    为了校验上一步的配置是否正确,可以在命令行中输了
    1
    cmake --version
    可以得到如下的返回,说明配置没有问题。
    演示1
TDM-GCC 安装配置
  • 安装
    为什么安装 TDM-GCC 而不推荐大家安装全网都在推荐的 MinGW ,这个是写这篇记录的重点,因为在window上我给Mingw整整坑了好几天,每一次都是在 make 的步骤中出现各种问题,其次 TDM-GCC也能使用MinGW,具体选择还是看一下自己的具体情况。
    这里也给出Mingw的下载直达地址Mingw
    我们后面使用编译的是TDM-GCC,在这里下载
  • 配置
    1、 新建环境变量:TDM_GCC_HOME=”你的安装目录到bin目录”.
    2、添加%TDM_GCC_HOME%到Path中即可.
  • 校验
    为了校验上一步的配置是否正确,因为我们是要使用MinGW,所以可以在命令行中输了
    1
    mingw32-make --version
    可以得到如下的返回,说明配置没有问题。
    演示2
    Python 安装配置
  • 安装
    Python的安装是因为编译代码中有部分是用python写的,并且是用python2.x(Python2.x和Python3.x的差别有点大),所以我们在官网下载一个python2.x相关的版本并且安装。
  • 配置
    1、 新建环境变量:PYTHON_27_HOME=”你的安装目录”.
    2、添加%PYTHON_27_HOME%到Path中即可.
  • 校验
    1
    python --version
    可以得到如下的返回,说明配置没有问题。
    演示3
OLLVM (goron) 分支下载

这里我选择的是9.0版本,Github仓库地址


OLLVM编译

  • 新建一个文件夹,并且进入这个构建文件夹

    1
    mkdir goron_build #创建一个文件夹

    然后进入到这个文件夹

    1
    cd goron_build
  • cmake 处理构建环境
    这个步骤处理非常快,大概一分钟就完成,运行指令

    1
    cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang -DLLVM_INCLUDE_TESTS=OFF ..\goron\llvm

    其中goron是clone下来的根目录,指令跑完goron_build文件夹会产生很多后续要构建的文件和反馈提示。
    演示4

  • make 编译
    这个是耗时最长,并且失败点最多的地方,需要注意的是编译环境中的编译工具的版本号与被编译的源码直接是否匹配,因为有些语法可能会出问题,比如python的语法。
    运行指令:

    1
    mingw32-make -j12

    这里的j12是使用了12线程编译,看自己机器的能力自己调整一下,我使用的是i7处理器,编译花了差不多30多分钟才完成。
    演示5
    编译过程比较漫长,并且在window下出错的概率确实比mac下要大很多(还去折腾了一下Ubuntu下的编译,因为window下已经成功了,就暂时没有去研究),祝大家好运吧。

NDK环境及其使用

在编译完OLLVM后,就需要开始配置编译好的文件了,主要是要替换一些文件,方便识别指定的命令做出指定的动作,来完成OLLVM的使命。

NDK版本

NDK的版本和需要编译的OLLVM也有一些关联,这点需要注意一些
目前我使用的NDK版本号为

1
ndkVersion '22.1.7171670'
llvm相关文件替换

找到所使用NDK版本所在的文件位置,比如我的放在

1
D:\ProgramFiles\Android\Sdk\ndk\22.1.7171670\toolchains\llvm\prebuilt\windows-x86_64

复制刚才编译出来的bin和lib覆盖这个目录的文件,在此之前建议备份一下llvm目录,因为可能在配置步骤中会出现问题,可以及时的还原。

配置参数

在AndroidStudio中找到你需要使用OLLVM的模块,找到对应的 build.gradle 对应位置设置你需要的混淆参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
android {
···
defaultConfig {
···
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
cppFlags "-mllvm -irobf-indbr -mllvm -irobf-icall -mllvm -irobf-indgv -mllvm -irobf-cse"
}
}
···
}
···
}
混淆效果

逆向中很重要的一个突破点就是字符串的查找线索和猜想,这里混淆效果还算比较好,这里原来是字符串,现在基本上找不到明文影子。
演示6


编译成品下载

编译好的文件和集成环境提供给大家,不想折腾的同学,看一下能不能帮助到你。


遇到的一些问题

在起初编译的环境中选择在window下,因为很多工作都还在window下感觉比较方便,后来没有成功后,转向了Mac环境下的编译,也出了各种问题,因为公司的Mac是M1,感觉不知道是不是很M1有关系,因为我在家里的Mac编译是没有问题的,附上Mac Pro编译的mac_build_9.0.zip

参考文档