首页
社区
课程
招聘
[原创]ollvm快速学习
发表于: 2018-4-6 21:48 24780

[原创]ollvm快速学习

2018-4-6 21:48
24780

   近来,ollvm在国内移动安全,尤其是安全加固上的使用越来越广泛,ollvm的混淆和反混淆也被视为比较高等的知识之一,让很多人感到无从下手,望尘莫及。如果你在google上搜索ollvm,你会发现第一页都是中文的搜索结果。其实,llvm和ollvm在国外是比较传统的东西,说到底也只是C++代码,难度大概等同于ART系统源码的程度。

本篇文章目地是为了从另一个从未出现的角度来让一个完全不懂llvm的新手快速上手ollvm,大神请直接跳过。

   注意:本文因角度不同,若引起误会,纯属个人理解不同,本人不会作出任何解释,请谅解。

1.     快速理解llvm、clang和ollvm的概念

我们不使用网上那些冗杂的阐述,一句话概括,llvm是一个完整的编译器架构,作用可以理解为制作一个编译器,llvm先将源码生成为与目标机器无关的LLVMIR代码,然后把LLVMIR代码先优化,再向目标机器的汇编语言而努力。经典编译器都可以分为前端、中层优化和后端:


我们从上图也理解了clang,是前端的一个套件,但在实际使用时,你会感觉到,我们只可以感受到clang,也只是在使用clang,因为编译的时候,是调用clang或clang++来编译源码。Ollvm呢?是基于LLVM的代码分支的代码混淆,对谁混淆?什么时候混淆?在中间表示IR层,通过编写pass(英文翻译:经过,自己理解,也不需要知道其正规的概念)来混淆IR,这样目标机器的汇编语言也就被混淆了:


当然,这里需要知道的是,即使不用ollvm,LLVM本身也是有很多pass的,我们这样简单的理解,LLVMIR本身是一种与目标机器无关的虚拟化代码,而在转化为真实汇编代码时,肯定要删除一些虚拟的东西,自然也需要pass。这样,我们就用不到200字的阐述完成了网上很多长篇大论才能达到的理解。

2、llvm与ollvm在移动加固的发展

   在开始制作安卓vmp时,llvm其实是被我们暂时放弃的一个方案。因为从smali上想可以使用llvm,还必须先克服smali到底怎么成为C/C++,当时他被提及,很大原因是安卓系统后端使用了llvm,但其实ART下和llvm关系已经不大了。当时都急于上架vmp,因此大部分都是采用折衷策略,如自定义dex结构、置换指令等。随着发展,smali2c渐渐成熟,可以smali2c了,自然ollvm是必然的一个选择。但一个新的问题出现了,就像很多加固网站,需要提供源码,或编译过程中的中间文件,说到底还是源码加固。

所以想做二进制加固的ollvm分支,需要注意一下。想做到二进制加固,没有一个自己的反汇编解析引擎是不可能的,目前用capstone比较多。但要真正做自己的二进制VMP加固,首先你得有一个反汇编引擎能把指令抽出来,同时转为了自己的虚拟指令,如果接上了llvm,最完美的方案就是把LLVMIR给虚拟为自己的虚拟指令,这个难度相当于把.netframwork的IL指令给虚拟了。可以先逃避了这两个问题,ARM指令得到后,利用简单的函数式指令解析来完成这个虚拟过程。我们认为,如果只有LLVMIR,如ollvm,是没有虚拟的,只是混淆。

3、利用beyondcompare+sourceinsight4的ollvm快速上手

Ollvm如果你去网上搜索资料学习,大概是这么几种文章:“LLVM编译器架构王者-编写简单的C虚拟编译器”、“ollvm+ndk编译环境的搭建”、“从0开始学习LLVM”、“LLVM PASS的完整编写”,当然这些文章都很不错。但对于一个新手来说,看了和没看其实区别不大。因为我们要学习ollvm,必须先抓住关键,到底一个llvm是如何变为ollvm,这是最简单,最直观的学习方式。

我们去下载一份llvm4.0源码(官网http://releases.llvm.org/4.0.1/llvm-4.0.1.src.tar.xz)和ollvm源码(https://github.com/obfuscator-llvm/obfuscator/tree/llvm-4.0),之所以使用4.01,因为4.0.0是2017.03的,而4.01相对时期接近一点。然后拉入beyondcompare,这里把会话设置取消勾选“比较时间戳”,以及把比较设置为“仅文件”,时间戳因为比较时间不是我们的重点,而之所以不采用原先的文件结构比较,是因为两者都有一些空文件夹,没有比较的意义。如图:



看来主要的差别就在这些文件夹里了。先看最外层的CMakeLists.txt(整个工程使用cmake编译)等3个文件:基本都是加入了产品的一些信息和协议:


主要是其他四个文件夹:

utils文件夹:主要是Revision的细微差别


tools文件夹:ollvm中有clang文件夹,也可以看出clang是作为工具在llvm中存在,而llvm中并没有此文件夹,在llvm官网中clang是作为单独源码而存在



include文件夹(整个文件夹内都是.h文件夹):

Ollvm多了llvm\Transforms\obfuscation文件夹,可以看出ollvm添加了一些功能头文件,一共6个文件。其中有5个我们可以理解为具体参数功能,fla 参数表示使用控制流平展(Control Flow Flattening)模式,sub参数表示使用指令替换(Instructions Substitution)模式,bcf参数表示使用控制流伪造(Bogus Control Flow)模式,aesSeed参数表示aes加密随机种子,split参数表示分离代码块,我们常用的是sub\bcf\fla。混淆参数代码我们在接下来分析,先看Utils.h文件

 

Utils.h(功能箱):


其实这里也可以看出来,ollvm基于了llvm,使用了llvm的头文件,这些头文件也在该include文件夹。

lib文件夹(\lib\Transforms):


这里稍微麻烦点,我们还是从最外层的两个文件分析,主要添加了obfuscation目录的编译和构建:

CMakeLists.txt:


LLVMBuild.txt:


再来看IPO文件夹的两个文件:


LLVMBuild.txt:


PassManagerBuilder.cpp(从文件名可以看出,pass管理生成,ollvm就是写pass),我们分三部分解析:

导入ollvm特有的头文件



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-1-24 15:28 被admin编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (18)
雪    币: 1696
活跃值: (2297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
消灭0回复
2018-4-7 15:04
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
消灭百浏览1回复惨案
2018-4-7 15:31
0
雪    币: 8224
活跃值: (1296)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
word很精彩,内容更精彩
2018-4-7 17:08
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这是beyondcompare  和  sourceinsight4  的使用说明文吗?
2018-4-8 17:25
0
雪    币: 185
活跃值: (159)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
job都笑掉了,哈哈哈哈,工具小子
2018-4-8 18:02
0
雪    币: 9
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢大神,最近正在看这方面的东西,一直没找到比较好的资料,这篇真是太及时了:)
2018-4-8 20:09
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
非常精彩的文章,楼主加油
2018-4-9 11:12
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
pass(英文翻译:传球,自己理解,也不需要知道其正规的概念)
LLVM(英文翻译:低端虚拟机,自己理解,也不需要知道其正规的概念)
beyondcompare(英文翻译:别安比较,自己理解,也不需要知道其正规的概念)
2018-4-10 10:24
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
刚注册的小号可以别跳了吗
2018-4-10 10:36
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
水军真好玩
2018-4-10 10:44
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
是的,  本小号确实想不出"经过"这么信达雅的翻译,  也不知道git  commit怎么看, 毕竟不会失传的socket算法
最后于 2018-4-10 10:57 被六少日编辑 ,原因:
2018-4-10 10:56
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
pass(英文翻译:经过,自己理解,也不需要知道其正规的概念)
2018-4-10 11:29
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这玩意儿,还能是优秀帖??看雪管理是不是傻?求别打脸
2018-4-10 11:48
0
雪    币: 5633
活跃值: (7199)
能力值: ( LV15,RANK:531 )
在线值:
发帖
回帖
粉丝
15

兄弟,看完你写的文章就能快速学习ollvm了?你为啥不看一下人家的ollvm源码分析是怎么写的:**********************

最后于 2020-12-9 14:38 被kanxue编辑 ,原因: 网站已失效,现已跳到不良网站去了
2018-4-16 14:49
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
兄弟哦  能不能先想清楚写啊,没有一点逻辑感,小学没毕业吧
2018-4-17 09:20
1
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2018-8-21 13:34
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
18
快速理清概念,写的很好。
2020-5-24 17:35
0
雪    币: 159
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢分享
2020-6-18 15:47
0
游客
登录 | 注册 方可回帖
返回
//