一、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安装gd扩展

    第一步 安装依赖 1.安装xpm yum install libXpm-devel 2.安装zlib wget http://zlib.net/zlib-1.2.8.tar.gz tar -xzvf ...

  2. linux中的strings命令

     strings - print the strings of printable characters in files.            意思是, 打印文件中可打印的字符.  我来补充一下吧 ...

  3. shell 构建脚本基础

    bash -v test.sh 启用 verbose 调试模式 bash -n test.sh  启用语法检查调试模式 bash -x test.sh  遍历脚本执行过程 一.基础参数 1.shell ...

  4. win10优化

    1. 关闭磁盘碎片整理.自动维护计划任务    磁盘C-属性–工具–对驱动器进行优化和碎片整理–优化–更改设置–取消选择按计划运行 2. 关闭Windows Defender    控制面板–Wind ...

  5. 第五次编程作业-Regularized Linear Regression and Bias v.s. Variance

    1.正规化的线性回归 (1)代价函数 (2)梯度 linearRegCostFunction.m function [J, grad] = linearRegCostFunction(X, y, th ...

  6. opencv学习之路(32)、角点检测

    一.角点检测的相关概念 二.Harris角点检测——cornerHarris() 参考网址: http://www.cnblogs.com/ronny/p/4009425.html #include ...

  7. [pycocotools修改]cocoeval.py

    __author__ = 'tsungyi' import numpy as np import datetime import time from collections import defaul ...

  8. python数据类型:字典dict常用操作

    字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的: Key: 不可变(可哈希)的数据类型.并且键是唯一的,不重复的. Value:任意数据(int,str,boo ...

  9. ECS之Git服务器搭建

    最简教程 ### . 安装Git 安装Git服务,命令如下: ```Shell $ yum install curl-devel expat-devel gettext-devel openssl-d ...

  10. js备战春招の四のDOM

    通过js查找html元素的三种方法: 1.通过id找到html元素. 2.通过标签名找到html元素. 3.通过类名找到html元素. DOM HTML document.write(); 直接写入h ...