一、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. PHP提交失败保留填写后的信息

    index.html: <html> <head> <title>jQuery Ajax 实例演示</title> </head> < ...

  2. A Simple Nim (SG打表找规律)

    题意:有n堆石子,每次可以将其中一堆分为数量不为0的3堆,或者从其中一堆中拿走若干个,最终拿完的那个人赢. 思路:直接暴力SG状态,然后找出其中的规律,异或一下每一堆的状态就可以了. #include ...

  3. mac系统如何处理来自身份不明的开发者

    打开终端(终端在 应用程序 -> 实用工具 内) sudo spctl --master-disable

  4. vim基本命令总结

    编辑模式下i 从光标所在位置前开始插入文本I 将光标移动到当前行行首,然后在其前插入文本a 用于在光标当前所在位置之后追加新文本A 将光标移动到所在行行尾,在那里插入新文本o 在光标所在行的下面新开一 ...

  5. 安卓websocket 封装基于Java-websocket

    本文借鉴于https://blog.csdn.net/u013872857/article/details/79190643感谢大神的贡献 借鉴文章所用websocket 第三方是:nv-websoc ...

  6. 给COCO数据集的json标签换行

    #include <iostream> #include <fstream> #include <string> #include <vector> u ...

  7. SpringBoot Tomcat启动报错

    中间的桥梁就是下面这个依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over ...

  8. objectarx 把当前图形输出

    方法1: AcDbDatabase *pdb; acdbCurDwg()->wblock(pdb); pdb->saveAs(str); pdb->closeInput(true); ...

  9. HTML与CSS的一些知识(四)

    续: line-height 用于设置一行文本行高,一般用于文本的垂直居中: display 用于设置元素的显示方式 float 浮动,让元素漂浮起来排列 浮动的影响: a.浮动后,行内元素可以支持宽 ...

  10. THUSCH 2017 大魔法师(矩阵乘法+线段树)

    题意 https://loj.ac/problem/2980 思路 区间修改考虑用线段树维护.由于一段区间的 \(A,B,C\) 可以表示成由原来的 \(A,B,C\) 乘上带上系数再加上某一个某个常 ...