0x1,首先介绍一下编译环境配置

1、UE4.25

2.vs2017(15.9),注:2019编译总是出现错误

3、cmake3.18.5,cmake的作用是为ollvm源码编译成适合于在vs2017上能够进行编译的项目解决文件。

4、andriod studio,最新版就行,为apk打包提供环境。

5、IDA,检查函数混淆的结果。

6、NDK r21b,andriod没有集成ndk,需要手动安装并且在ue4中指定路径。

7、需要注意的是llvmbuild需要Python 2.x,如果你只有或CMake优先选择了Python 3.x,则会导致以下错误:

ModuleNotFoundError: No module named 'llvmbuild'

0x2,ollvm简介

在介绍ollvm之前,需要先了解一下llvm

LLVM(low level virtual machine)从本质上来说,是一个开源编译器框架,能够提供程序语言的编译期优化、链接优化、在线编译优化、代码生成。LLVM有两个特点:

(1)LLVM有一个特定指令格式的IR语言,我们可以通过书写Pass来对其IR进行优化。

(2)可以作为多种语言的后端,提供与编程语言无关的优化和针对多种CPU的代码生成功能。

LLVM主要由Clang前端、IR优化器(Pass)和LLVM后端构成。其功能分别是:

clang前端:将平台相关的源码生成与平台无关的IR(llvm Bitcode)。

IR优化器:主要对IR进行优化。

llvm后端:将优化后的IR转换为与平台相关的汇编代码或者机器码。

Clang前端以.c文件为输入,经语法词法分析后解析为抽象语法数,最后通过LLVM内联API变为LLVM IR。其功能为:词法分析器:把输入的程序代码切成token;语法分析器:接收token流解析为AST。

gcc和clang的区别

GCC特性:除支持C/C++/ Objective-C/Objective-C++语言外,还是支持Java/Ada/Fortran/Go等;当前的Clang的C++支持落后于GCC;支持更多平台;更流行,广泛使用,支持完备。

Clang特性:是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。编译速度快;内存占用小;兼容GCC;设计清晰简单、容易理解,易于扩展增强;基于库的模块化设计,易于IDE集成;出错提示更友好。

IR优化器:

LLVM IR包含三种格式:一种是在内存中的编译中间语言;一种是硬盘上存储的二进制中间语言(以.bc结尾),最后一种是可读的中间格式(以.ll结尾)。这三种中间格式是完全相等的。LLVM IR是LLVM优化和进行代码生成的关键。根据可读的IR,我们可以知道再最终生成目标代码之前,我们已经生成了什么样的代码。我们通过Pass来对IR进行相应的优化。

文本格式如下:

define i32 @add1(i32 %a, i32 %b) {
entry:
%tmp1 = add i32 %a, %b
ret i32 %tmp1
} define i32 @add2(i32 %a, i32 %b) {
entry:
%tmp1 = icmp eq i32 %a, 0
br i1 %tmp1, label %done, label %recurse recurse:
%tmp2 = sub i32 %a, 1
%tmp3 = add i32 %b, 1
%tmp4 = call i32 @add2(i32 %tmp2, i32 %tmp3)
ret i32 %tmp4 done:
ret i32 %b

llvm后端

Llvm clang编译器主要是将各平台源代码编译成与平台无关的IR指令集,这将支撑对IR的优化及转换操作,而llvm后端的主要工作是优化IR指令,并将这些与平台无关的IR指令转换成目标设备相关的指令。

由上图所示,LLVM IR进入后端要经过pass优化,指令选择,指令调度,寄存器分配,代码布局优化以及汇编发行等过程。上述各过程都是pass优化的过程,普通(白色)pass可由用户自定义,内置(灰色)pass由一系列小的pass构成,换句话说我们可以对每一个阶段都可以进行不同程度的优化。同时无须为每个目标平台编写重复的代码。

LLVM的pass均用C ++类编写,用户编写的Pass都继承于内置的父Pass类,然后重新父类的某个方法(即虚函数)。大多数pass都写在一个 .cpp文件中,并且它们的类的子Pass类是在匿名名称空间中定义的(这使其对定义文件完全私有)。并且在外部定义pass ID(用于识别pass),以及对Pass进行注册。

ollvm全称obfuscator-llvm,即带有函数混淆功能的llvm。

对于LLVM来说,其前端是clang,在编译源码文件的时候使用的编译工具也是clang。而生成中间IR代码后需要对IR代码进行一些操作,例如添加一些代码混淆功能。LLVM的做法是通过编写Pass(其实就是对应的一个个类,每个类实现不同的功能)来实现混淆的功能。所以实现混淆,其实就是编写功能性的Pass。

打开include文件夹

 
include文件夹

其实从文件夹名称就能判断include文件夹是头文件所在的地方,include文件夹之下包含两个文件夹:llvm和llvm-c。

llvm文件夹下有如下目录:llvm\Transforms\Obfuscation,可以看到此文件夹下有一些头文件:

 
Obfuscation头文件

此处是存放OLLVM项目中自己写的pass的头文件的地方,由此可知,如果我们需要些自己的pass的话,那么对应的pass类的头文件也需要在include\llvm\Transforms新建一个文件夹专门用来存放头文件。头文件的具体内容暂且不管,接下来再去看看实现文件在哪里。

打开与include文件夹平行的lib文件夹并进入lib\Transforms\Obfuscation目录:

 
Obfuscation所在目录

打开Obfuscation目录,可以看到与之前的头文件一一对应的实现文件:

 
实现文件

至此,与我们编写自己的pass一样,在include\llvm\Transforms\Obfuscation定义头文件,在lib\Transforms\Obfuscation写实现文件。这样,我们就明白了该如何开始写自己的项目。不过要注意的是,不管是LLVM还是OLLVM,它们都是通过编写makefile来实现项目的运行的,所以我们得熟练掌握makefile的编写与依赖,才能玩转自己的项目。

下面介绍编译过程

1、到https://github.com/heroims/obfuscator/tree/llvm-9.0下载大佬移植好的ollvm,原版的ollvm只支持到4.0
2、用cmake生成ollvm的VS2017项目文件,命令如下
cmake -G "Visual Studio 15 2017" -A x64 -Thost=x64 -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../ollvm文件夹目录
3、用vs2017打开llvm.sln,对clang和clang-format进行编译,用release编译,加快速度
4、编译完成后,将relase下的bin和lib复制到ndk目录中的\android-ndk-r21b\toolchains\llvm\prebuilt\windows-x86_64,对lib和bin进行替换,替换前将原lib和bin文件进行备份
5、上述步骤完成后,用ue4对项目进行打包确认无误即可
检测clang的版本

OK!

ollvm在VS2017下编译的更多相关文章

  1. 编译并使用boost库(win7+boost1.63+vs2015+32位or 64位),超详细,boost于vs2017下编译(64/32bit)

    首先下载得到boost的最新版(目前最新版是1.63) 下载地址: http://www.boost.org   也可以从这里直接下载 http://download.csdn.net/detail/ ...

  2. 成功实现在VS2017下编译含<pthread.h>的代码:

    VS2017配置使用#<pthread.h> https://blog.csdn.net/cry1994/article/details/79115394(原来SystemWow64里面存 ...

  3. boost::VS2017下编译和配置boost库

    环境: win10  vs2017  v141 1.下载  boost_1_70_0.zip. 2.以管理员方式打开 3. bootstrap.bat 4.编译64位库 b2.exe stage -- ...

  4. VS2017下编译iconv

    从http://www.gnu.org/software/libiconv/ 下载 libiconv-1.11.1, 这是最后一个支持MSVC编译的版本. 打开 Visual Studio 2017 ...

  5. VS2017在Release下编译错误C1001

    在使用VS2017编译C程序时,Debug模式下编译链接执行都没有问题,但是一转到Release模式下就出现下列编译链接错误(IDE:VS2017 /VC++/MFC程序,目标平台x86+Win32位 ...

  6. Win64下编译OSG详细过程(Win10+VS2015+OSG3.6.3)

    目录 1. 数据资源准备 2. 编译第三方库 3. 编译GDAL 4. 编译OSG 1) CMAKE_INSTALL_PREFIX: 2) BUILD_OSG_EXAMPLES/BUILD_MFC_ ...

  7. windows下编译php7图形库php_ui.dll

    CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...

  8. Windows下编译最新版ChezScheme

    据说ChezScheme是最快的神级编译器,一秒钟几百万行,王垠说的2秒内编译自身绝不是夸张(看这里<揭秘Chez Scheme>,Scheme中文社区).ChezScheme由美国印第安 ...

  9. 不要着急改代码,先想想--centos 6.8下编译安装tmux

    诸位读者新年好,2017开年第一篇博客,请允许我先问候一下看到这篇博客的诸位.写博客是我2017年定下的目标之一,希望我会坚持下去. 最近打算尝试一下tmux这个神器,于是有了这一篇关于思维方式的Bl ...

随机推荐

  1. Python对MySQL进行增删查改

    python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...

  2. asp.net 页面,文字自适应手机屏幕

    (1)在<head>和</head>之间插入代码. <meta name="viewport" content="width=device- ...

  3. [MIT6.006] 7. Counting Sort, Radix Sort, Lower Bounds for Sorting 基数排序,基数排序,排序下界

    在前6节课讲的排序方法(冒泡排序,归并排序,选择排序,插入排序,快速排序,堆排序,二分搜索树排序和AVL排序)都是属于对比模型(Comparison Model).对比模型的特点如下: 所有输入ite ...

  4. 《.NET 5.0 背锅案》第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore

    在第1集的剧情中,主角是".NET 5.0 正式版 docker 镜像",它有幸入选第1位嫌疑对象,不是因为它的嫌疑最大,而是它的验证方法最简单,只需要再进行一次发布即可.我们在周 ...

  5. solr 笔记

    1.sorl其实是对存储的内容,根据相应的域和域的类型先分词,停顿,过滤(大小写转换)等等;然后建立多级索引.对搜索条件也是根据相应的域和域的类型进行分词,停顿,同义词,过滤(大小写转换)等等;然后建 ...

  6. Ceph OSD服务失效自动启动控制

    前言 服务器上面的服务会因为各种各样的原因失败,磁盘故障,权限问题,或者是服务过载引起超时,这些都可能引起 这个在ceph里面systemctl unit 默认有个on-fail restart,默认 ...

  7. 增量式爬虫 Scrapy-Rredis 详解及案例

    1.创建scrapy项目命令 scrapy startproject myproject 2.在项目中创建一个新的spider文件命令: scrapy genspider mydomain mydom ...

  8. kubernetes个人笔记(一)

    一.证书工具 CFSSL keytools,openssl 1.介绍 CFSSL is CloudFlare's PKI/TLS swiss army knife. It is both a comm ...

  9. Mac如何像Windows一样在文件系统中查看文件?

    许多Windows系统用户刚转向Mac的时候,肯定非常不适应Mac系统独特的文件系统,就像安卓转iOS系统一样,那么Mac电脑如何像Windows系统一样,能够查看电脑上的各个盘,如C盘D盘等等,然后 ...

  10. Vegas干货分享,如何制作霓虹灯效果

    在各色各样的展会中,各种炫彩华丽的灯光和光影一直都能吸引到人们大量的关注.同样,在视频制作中,光线的气氛渲染也是常用的方法,常用也就代表着效果明显,也是很多刚学视频剪辑小伙伴们想要学习的一种方法. 今 ...