一、OLLVM特性

目前ollvm支持的特性有以下几种:

  1. 指令替换 -mllvm -sub
  2. 虚假控制流 -mllvm -bcf
  3. 打平控制流 -mllvm -fla
  4. 函数(Funtions)注解

二、指令替换

所谓指令替换仅仅是对标准二进制运算(比如加、减、位运算)使用更复杂的指令序列进行功能等价替换,当存在多种等价指令序列时,随机选择一种。

这种混淆并不直截了当而且并没有增加更多的安全性,因为通过重新优化可以很容易地把替换的等价指令序列变回去。然而,提供一个伪随机数,就可以使指令替换给二进制文件带来多样性。

目前,只有在整数上的操作可用,因为在浮点数上的运算替换会带来四舍五入的错误以及不必要的数值不准确。

可用选项有

  1. -mllvm -sub:激活指令替换趟(pass)
  2. -mllvm -sub_loop=3:如果激活了指令替换,使用这个选项在一个函数中应用3次指令替换。默认应用1次。

如何实现?

  1. 加法

    (1)a = b - (-c)

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = sub i32 0, %1

      %3 = sub nsw i32 %0, %2

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = sub i32 0, %0

      %3 = sub i32 0, %1

      %4 = add i32 %2, %3

      %5 = sub nsw i32 0, %4

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = add i32 %0, 1107414009

      %3 = add i32 %2, %1

      %4 = sub nsw i32 %3, 1107414009

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = sub i32 %0, 1108523271

      %3 = add i32 %2, %1

      %4 = add nsw i32 %3, 1108523271

  2. 减法

    (1)a = b + (-c)

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = sub i32 0, %1

      %3 = add nsw i32 %0, %2

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = add i32 %0, 1571022666

      %3 = sub i32 %2, %1

      %4 = sub nsw i32 %3, 1571022666

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = sub i32 %0, 1057193181

      %3 = sub i32 %2, %1

      %4 = add nsw i32 %3, 1057193181

  3. 按位与

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = xor i32 %1, -1

      %3 = xor i32 %0, %2

      %4 = and i32 %3, %0

  4. 按位或

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = and i32 %0, %1

      %3 = xor i32 %0, %1

      %4 = or i32 %2, %3

  5.  按位异或

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

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = xor i32 %0, -1

      %3 = and i32 %1, %2

      %4 = xor i32 %1, -1

      %5 = and i32 %0, %4

      %6 = or i32 %3, %5

三、虚假控制流

这种方式通过在当前基本块之前添加一个基本块,来修改函数调用流程图。新添加的基本块包含一个不透明的谓语,然后再跳转到原来的基本块。

原始的基本块会被克隆,并充满了随机的垃圾指令。

可用选项有:

(1)-mllvm -bcf:激活虚假控制流趟(pass)

(2)-mllvm -bcf_loop=3:如果虚假控制流被激活,在一个函数中应用三次。默认应用一次。

(3)-mllvm -bcf_prob=40:如果虚假控制流趟被激活,一个基本块将会以40%的概率被混淆。默认30%。

一个例子:

下面的C语言代码,

#include <stdlib.h>

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

int a = atoi(argv[1]);

if(a == 0)

return 1;

else

return 10;

return 0;

}

会被翻译成这样的中间代码:

虚假控制流的趟结束之后,我们或许会得到下面的控制流图:

四、控制流打平

控制流打平的目的是将程序的控制流图完全地扁平化。

可用选项:

(1)-mllvm -fla:激活控制流打平

(2)-mllvm -split:激活基本块划分。一起使用时能提高打平能力。

(3)-mllvm -split_num=3:如果激活控制流打平,对每一个基本块应用三次控制流打平。默认使用1次。

考虑下面的C代码片段

#include <stdlib.h>

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

int a = atoi(argv[1]);

if(a == 0)

return 1;

else

return 10;

return 0;

}

经过控制流打平后,这段代码代码变成了这样:

#include <stdlib.h>

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;

}

所有的基本块都被分开且放到了无限循环中,程序流变成了由switch和变量b控制。在打平控制流之前的控制流是这样的:

打平之后的控制流是这样的:

五、函数注解

使用注解可以定制哪个函数参与混淆。

OLLVM特性、使用原理的更多相关文章

  1. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  2. Hive 特性及原理

    特点:Hive是构建在hadoop之上的数据仓库.数据存储在hdfs上,数据计算用的mapreduce框架.用户无需掌握MR的编写,通过类SQL语句即可自动生成查询计划. 主要内容:     接入入口 ...

  3. 深入剖析Redis客户端Jedis的特性和原理

    一.开篇 Redis作为目前通用的缓存选型,因其高性能而倍受欢迎.Redis的2.x版本仅支持单机模式,从3.0版本开始引入集群模式. Redis的Java生态的客户端当中包含Jedis.Rediss ...

  4. ☕【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理

    FST的概念和定义 FST序列化全称是Fast Serialization Tool,它是对Java序列化的替换实现.既然前文中提到Java序列化的两点严重不足,在FST中得到了较大的改善,FST的特 ...

  5. IT领域中哲学原理的应用——个体与整体

    个体与整体哲学原理在很多学科和领域中都会得到应用,今天就看看IT行业中有哪些地方应用了个体和整体的原理. IT行业可以分为硬件.软件.网络三个领域,我们可以分别针对这三个领域来看下. 硬件方面,最基本 ...

  6. 高性能JavaScript模板引擎原理解析

    随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC ...

  7. 深入探讨 CSS 特性检测 @supports 与 Modernizr

    什么是 CSS 特性检测?我们知道,前端技术日新月异的今天,各种新技术新属性层出不穷.在 CSS 层面亦不例外. 一些新属性能极大提升用户体验以及减少工程师的工作量,并且在当下的前端氛围下: 很多实验 ...

  8. Java基础1:深入理解Java面向对象三大特性

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. 基本功 | Litho的使用及原理剖析

    1. 什么是Litho? Litho是Facebook推出的一套高效构建Android UI的声明式框架,主要目的是提升RecyclerView复杂列表的滑动性能和降低内存占用.下面是Litho官网的 ...

随机推荐

  1. 【Linux】Jenkins安装(二)

    Jenkins介绍 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. 安装环境 操作系统:lin ...

  2. 关于表格table嵌套,边框合并问题的解决方法,table嵌套(转)

    原文地址:http://www.cnblogs.com/zhangym118/archive/2016/05/16/5496931.html [问题] 外层table与内层table嵌套,内外表格都需 ...

  3. JQuery选择器,动画,事件和DOM操作

    JQuery是由JS封装的一些方法,供我们调用,可以快速的实现某些JS功能,实际是JS编写的方法包 将JQuery文件放到JS文件夹下,然后引用到<head></head>中 ...

  4. (简单)华为M3揽月 BTV-W09的Usb调试模式在哪里开启的经验

    每次我们使用pc链上安卓手机的时候,如果手机没有开启Usb调试模式,pc则没办法成功识别我们的手机,有时候,我们使用的一些功能较好的app如以前我们使用的一个app引号精灵,老版本就需要开启Usb调试 ...

  5. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  6. C++中的纯虚方法

    在学习数据结构中优先级队列时遇到纯虚方法的定义,一时没想起来,便查了一下. 1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义 ...

  7. 获取某个元素第一次出现在数组(json数组)的索引

    function firstIndex(arr, text) { // 若元素不存在在数组中返回-1 let firstVal = -1; for (let i = 0; i < arr.len ...

  8. redis的架构(一)

    redis认证 redis的认证比较简单,这里简单来说明一下怎么设置redis的认证: redis的配置文件中有一个requirepass字段,在后面直接写上对应的密码即可.默认redis的不开启认证 ...

  9. PL/SQL数据类型

    在定义变量或常量时,必须要指定一个数据类型,PL/SQL是一种静态类型化的程序设计语言,静态类型化又称为强类型化,也就是说类型会在编译时而不是在运行时被检查,这样在编译时便能发现类型错误,以便增强程序 ...

  10. Windows 7远程桌面设置

    1. 开启防火墙 可在”计算机管理“中,打开"服务和应用程序"-"服务",找到"Windows Firewall",双击"Wind ...