一、OLLVM特性
目前ollvm支持的特性有以下几种:
- 指令替换 -mllvm -sub
- 虚假控制流 -mllvm -bcf
- 打平控制流 -mllvm -fla
- 函数(Funtions)注解
二、指令替换
所谓指令替换仅仅是对标准二进制运算(比如加、减、位运算)使用更复杂的指令序列进行功能等价替换,当存在多种等价指令序列时,随机选择一种。
这种混淆并不直截了当而且并没有增加更多的安全性,因为通过重新优化可以很容易地把替换的等价指令序列变回去。然而,提供一个伪随机数,就可以使指令替换给二进制文件带来多样性。
目前,只有在整数上的操作可用,因为在浮点数上的运算替换会带来四舍五入的错误以及不必要的数值不准确。
可用选项有
- -mllvm -sub:激活指令替换趟(pass)
- -mllvm -sub_loop=3:如果激活了指令替换,使用这个选项在一个函数中应用3次指令替换。默认应用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))