一、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. Java 多线程之Timer与ScheduledExecutorService

    1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗:然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只 ...

  2. Redmine(window7)安装

    首先要准备Ruby相关文件,Redmine是基于Ruby on rails开发的. 1.下载railsinstaller,我这时下载的版本是railsinstaller-2.2.1.exe,对应的官网 ...

  3. ng2

    angularjs2的环境问题解决了好久. 百度到的答案也是各种各样还解决不了我的问题. 好在这几天经过不断的测试终于给解决了. ERROR in AppModule is not an NgModu ...

  4. bzoj2809 [Apio2012]dispatching(左偏树)

    [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...

  5. 运输计划NOIP2015Day2T3

    运输计划 题目描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条 航道连通了 L 国的所有星球. 小 P 掌管一 ...

  6. JAVA课堂测试之查找字母和单词出现次数、频率

    代码如下:没有加注释,自己研究吧. import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;i ...

  7. webservice接口的开发和调用

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  8. Mysql查询创建和导入操作

    如何安装: https://www.cnblogs.com/bigbrotherer/p/7241845.html 登录: mysql -uroot -p 输入密码:xxxx 显示当前数据库: sho ...

  9. JAVA获取计算机IP地址

    import java.net.InetAddress;import java.net.UnknownHostException;public class HuoQu {    public stat ...

  10. Java笔记 #06# 自定义简易参数校验框架——EasyValidator

    索引 一.校验效果演示 二.校验器定义示例 定义一个最简单的校验器 正则校验器 三.EasyValidator的实现 四.更好的应用姿势——配合注解和面向切面 “参数校验”属于比较无聊但是又非常硬性的 ...