代码混淆android.mk,利用ollvm进行代码混淆

OLLVM简介

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加对逆向工程的难度。

OLLVM是基于LLVM实现的,LLVM是一个编译器框架,它也采用经典的三段式设计。前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的Pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,不同的前端语言最终都转换成同一种的IR。

OLLVM的混淆操作就是在中间表示IR层,通过编写Pass来混淆IR,然后后端依据IR来生成的目标代码也就被混淆了。得益于LLVM的设计,OLLVM适用LLVM支持的所有语言(C, C++, Objective-C, Ada 和 Fortran)和目标平台(x86, x86-64, PowerPC, PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ, 和 XCore)。

OLLVM的几种混淆方式

OLLVM默认支持 -fla -sub -bcf 三个混淆参数,这三个参数可以单独使用,也可以配合着使用。-fla 参数表示使用控制流平展(Control Flow Flattening)模式,-sub参数表示使用指令替换(Instructions Substitution)模式,-bcf参数表示使用控制流伪造(Bogus Control Flow)模式

-sub instruction substitution(指令替换)

-fla control flow flattening(控制流平坦化)

-bcf bogus control flow(控制流伪造)

此外,OLLVM支持对单个函数进行混淆,即Functions annotations模式

以下分别介绍这几种方式并举例说明:

instruction substitution(指令替换)

指令替换是一种比较简单的混淆方式,OLLVM将一些简单的运算复杂化,但这种方式容易被代码优化给去除,目前OLLVM只实现对整数运算的混淆。

加法混淆

例如 a = b + c 可以被混淆为:

1

2

3

41. a = b - (-c)

2. a = -(-b + (-c))

3. r = rand (); a = b + r; a = a + c; a = a - r

4. r = rand (); a = b - r; a = a + b; a = a + r

减法混淆

例如 a = b-c 可以被混淆为:

1

2

31. a = b + (-c)

2. r = rand (); a = b + r; a = a - c; a = a - r

3. r = rand (); a = b - r; a = a - c; a = a + r

AND运算混淆

a = b & c => a = (b ^ ~c) & b

OR运算混淆

a = b | c => a = (b & c) | (b ^ c)

XOR运算混淆

a = a ^ b => a = (~a & b) | (a & ~b)

如果一种运算对应多种混淆方式,OLLVM将会随机选择一种,以下为使用OLLVM进行指令替换后的前后对比:

源码:1

2

3

4

5int test(int a,int b)

{

int c = a + b;

return c+2;

}

sub前:

5a76e2be7f4db42c7960e97b5704ac4b.png

sub后

b8314f626a64fd7a8d2a3f0eebfb1ed2.png

分析汇编指令得出,a+b+2 运算变成了 -(-b-(a+2))

control flow flattening(控制流平坦化)

control flow flattening(控制流平坦化)通过多个case-swich结构将程序的控制流变成扁平形状,打破原有的逻辑结构,增加逆向的难度。

例如对于以下代码:

1

2

3

4

5

6

7

8

9#include

int main(int argc, char** argv) {

int a = atoi(argv[1]);

if(a == 0)

return 1;

else

return 10;

return 0;

}

OLLVM将把它变为如下结构:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22#include

int main(int argc, char** argv) {

int a = atoi(argv[1]);

int b = 0;

while(1) {

switch(b) {

case 0:

if(a == 0)

b = 1;

else

b = 2;

break;

case 1:

return 1;

case 2:

return 10;

default:

break;

}

}

return 0;

}

从代码中可以看到,OLLVM将源代码分割为几个基本块,并放在一个while循环结构中无线循环,程序的流程由变量b控制。

以下是使用OLLVM进行控制混淆后的前后对比:

源码1

2

3

4

5

6

7

8

9#include

int main(int argc, char** argv) {

int a = atoi(argv[1]);

if(a == 0)

return 1;

else

return 10;

return 0;

}

fla之前:

0d2e39e7514d5bebe1ac6ea2cb0aa034.png

fla之后:

c063efc3e962a7a8199ba302f85c9ac7.png

F5之后的代码:

048be126114b973842b938ce2a7a82bb.png

由此可见,fla之后的控制流比较复杂,通过分析fla之后的代码,我们发现代码中的result仅仅受v7的影响,但分析起来着实费力。

bogus control flow(控制流伪造)

bogus control flow通过在源程序的控制流中添加一些基本块,这些基本块仅仅起了连接作用,并不影响实际的执行逻辑。

以下为使用OLLVM进行控制流伪造后的对比:

源码

1

2

3

4

5

6

7

8

9#include

int main(int argc, char** argv) {

int a = atoi(argv[1]);

if(a == 0)

return 1;

else

return 10;

return 0;

}

bcf之前:

![upload successful](/images/pasted-128.png)

bcf之后:

![upload successful](/images/pasted-131.png)

F5之后的代码:

![upload successful](/images/pasted-132.png)

由此看出,bcf的方式在程序中增加了一个代码块,这个代码块对函数返回值没有任何影响,但对于逆向人员来说,增加了其逆向分析的无用功。

Functions annotations

有时候为了提高效率,开发者仅需要对指定的函数进行混淆,OLLVM的Functions annotations模式支持对单个函数进行混淆。比如,想对函数func()使用bcf混淆,只需要给函数func()增加bcf属性即可。

1int func() __attribute((__annotate__(("bcf"))));

OLLVM的fla,sub和bcf三个属性可以搭配使用,只需要添加对应的编译选项即可。

利用OLLVM进行Android native代码混淆

1.下载并编译ollvm1

2

3

4

5$ 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

2.配置NDK以支持ollvm新建编译链

在 android-ndk-r14b/toolchains 下新建目录 ollvm-4.0/prebuilt/darwin-x86_64(我的环境是mac),把前一步编译生成的结果拷贝到此目录下(主要是bin和lib)

配置编译链

在 android-ndk-r14b/build/core/toolchains 目录下,新建目录 arm-linux-androideabi-clang-ollvm4.0,拷贝目录 arm-linux-androideabi-clang 下的文件 config.mk 与 setup.mk 到 arm-linux-androideabi-clang-ollvm4.0 中,修改setup.mk文件。1

2

3

4

5

6

7

8

9############################ 原始配置 ############################

#LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,llvm)

#LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

#################################################################

############################ 修改后 #############################

OLLVM_NAME := ollvm-4.0

LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(OLLVM_NAME))

LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

#其他配置不做修改

3.使用ollvm进行编译

使用 ollvm 进行 ndk 的编译需要对 Application.mk 和 Android.mk 文件做相应的修改。

Android.mk 中添加混淆编译参数:

1LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla

Application.mk 中配置 NDK_TOOLCHAIN_VERSION

1

2APP_ABI := x86 armeabi-v7a x86_64 arm64-v8a armeabi mips64

NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0

参考资料:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统的适配国产手机,真正的好消息!其它国产机,也在适配华为鸿蒙系统...

众所周知,据华为消费者业务软件部总裁王成录的说法,今年6月初,华为手机就能全面升级鸿蒙2.0,迟到近两年的、真正的“一夜之间就可以替换掉安卓”。而近日,又传出了真正的好消息,那就是其它国产手机厂商&…

三星s4 android 6.0吗,快了 三星手机适配Android 6.0时间公布

快了 三星手机适配Android 6.0时间公布2016年01月26日 00:04作者:董岩编辑:董岩文章出处:泡泡网原创分享作为全球范围内无可争议的安卓手机巨头之一,三星在为其旗下手机适配安卓新系统方面历来算是相当上心的一个厂家。日前就已经…

xrdpdf卡片在哪可下载_暑假学习英语字母,就是这样简单(附可打印字母卡下载)...

英语字母是所有英语学习的基础,所以,要想学好英语,第一步,必须是学好字母,为后面的更深层次的学习打下坚实的根基。今天,我们给大家分享最全面的英文字母学习法,建议收藏,文章最后附…

32 位的有符号整数_leetcode 7 整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123 输出: 321示例 2:输入: -123 输出: -321示例 3:输入: 120 输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根…

安卓帧数监测软件_扬尘在线监测系统实现工地智能监控

近年来,随着越来越多的建设项目在建设中,建筑工地越来越广泛。传统人力检查的检查结果主要依靠估计,难以量化和分析,导致相应处罚的科学依据不足。扬尘在线监测系统实现了对施工现场的智能检测,可以对施工现场扬尘进行…

html 切换主题,html切换主题实现方案

方案一使用css的var属性,当然此时不考虑低版本浏览器。1,在default.css主题根元素定义颜色变量:root {--main_color: #03a9f4; // 主题色--main_light: #33baf7; // 二级主题色 常用背景为主题色下的hover--main_lighter: #65caf5; // 三级主题色 常用bo…

json取数据怎么取_干货速递丨书名应该怎么取?

很多作者开书前都会遇到这个困扰:“什么样的书名是好的?”在跟一线编辑广泛交流后,大家普遍认为:一个好书名,既应该是能突出作品内容特点、故事主题,又具有一定的趣味性的,能吸引读者&#xff0…

android加一减一控件,Android的步进器(增加/减少值)控件?

用于Android的步进器(增/减值)控件?没有像Android中的Stepper这样的内置控件但是您可以尝试这种方式android:layout_width"wrap_content"android:background"#ffffff"android:layout_height"wrap_content"android:orientation"h…

安装教程rtx2080ti_点云深度学习环境配置指南(一)Ubuntu16.04+RTX2080ti

【今日导读】想做点云深度学习?先把环境配置好吧。本期为初学者带来环境配置指南,有需求的同学赶快上手吧。配置为:Ubuntu16.04RTX2080tiNVIDIA驱动cuda10.1cudnn7.5。一、安装NVIDIA驱动法一(优先推荐):先添加NVIDIA 的ppa 源&am…

计算机管理员相关知识,计算机管理员述职报告范文

计算机管理员述职报告范文计算机管理员述职报告范文尊敬的医院领导:我叫xxx,20xx年7月毕业于西南计算机科学与技术专业。20xx年8月到医院工作,从事网络管理工作已有4年时间,能够胜任本职工作,现将任职以来的主要工作报…

计算机网络5g,计算机网络参考模型与5G协议

一、分层思想将复杂的流程分解为几个功能相对单一的子过程(1)整个流程更加清晰,复杂问题简单化(2)更容易发现问题并针对性的解决问题二、OSI七层参考模型1984年颁布了开发系统互连(OSI)参考模型;一个开放式体系结构,将网络分为七层分层功能物…

双百双新产业项目是什么_投资380亿,广西38个“双百双新”产业项目开竣工

广西2020年四季度“双百双新”产业项目集中开竣工活动现场。图片由自治区工信厅提供柳州分会场视频连线。图片由自治区工信厅提供与会嘉宾。图片由自治区工信厅提供广西新闻网南宁12月8日讯(记者 谢琳琳)12月8日,广西举行2020年四季度“双百双新”产业项目集中开竣工…

else 策略模式去掉if_业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!...

​对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。…

istio springcloud_手牵手一起学Springcloud(1)微服务这么流行,你理解了嘛?

在前一段时间,我们实验室的项目开始变得越来越麻烦,代码也越来越臃肿,一个人兼顾前后端的全栈开发,实在是力不从心,没有一点点幸福感,于是迫切的想要解放生产力,放飞自我,因此开始决…

力改变物体形状举例_人教版八年级物理下册第七章《力》知识点大全

力是物体对物体的作用,比如推土机推动了土。知识点1:力1.概念:是物体对物体的作用叫做力。2.特点:物体间力的作用是相互的。3.力的单位和表示符号:(1)力的单位:牛顿,简称牛(N)。托起一个鸡蛋大约…

bool类型数组转换成一个整数_Go 学习笔记 02 | 基本数据类型以及 byte 和 rune 类型...

一、基本数据类型unsafe.Sizeof() 查看不同长度的整型在内存中的存储空间。 类型转换,高位向低位转换要注意溢出。数字字面量语法。64 位系统中 Go 语言中浮点数默认是 float64。二、Golang 中 float 精度丢失问题利用第三方包:http://github.com/shopsp…

ldap基本dn_LDAP 中 DN CN DC OU

DN 的英文名称是(distinguished name),直接翻译过来就是专有名称。简单的就可以理解为一个路径就对了。这个路径可以指向 OU ,也可以指到 CN。其中 DN 有三个属性,分别是CN,OU,DC。DC (Domain C…

滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟

今天我们来说说SysTick定时器。SysTick定时器在从参考手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下SysTick定时器的作用…

多选框实现全选_Angular1.x-checkbox-全选amp;单选amp;多选

ng-checked&#xff1a;Angular里ng-checked属性影响复选框的状态&#xff0c;值>true则复选框选中&#xff0c;值>false则取消选中。HTML:<div class"col-lg-4"><fieldset><legend>选题列表</legend><div class"table-respon…

2020笔记本性价比之王_什么笔记本性价比高?2020性价比最高的笔记本电脑

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读者参考&…