LLVM学习——OLLVM pass

OLLVM主要包含三种独立的pass,每种pass的详细文档可参看:

1. 控制流扁平化  https://github.com/obfuscator-llvm/obfuscator/wiki/Control-Flow-Flattening

2. 指令变换  https://github.com/obfuscator-llvm/obfuscator/wiki/Instructions-Substitution

3. 流程伪造  https://github.com/obfuscator-llvm/obfuscator/wiki/Bogus-Control-Flow

 

下面简单对三种pass的思路总结一下。

  • 控制流扁平化

通过改变源代码的结构,使得程序逻辑复杂,不易被静态分析,增加逆向难度。比如转换成switch   case  结构,通过多个分支,需要实际运行才能知道执行顺序,以此达到混淆的目的

  • 指令变换

采用功能上等效但更为复杂的指令序列来替换标准的二进制运算符(如加、减或布尔运算符)。当有几个等效的指令序列可用时,将随机选择一个。

这种混淆非常简单,并且不会增加许多安全性,可以通过重新优化生成的代码轻松地将其删除。但是,如果伪随机数发生器使用不同的值作为中自,则指令变换会在生成的二进制文件中带来多样性。

类似于b+c,被转换成b-(-c) , -(b+(-c))等

  • 流程伪造

该方法通过在当前基本块之前添加一个基本块来修改函数调用图。这个新的基本块包含一个不透明谓词,然后有条件地跳转到原始基本块。原始的基本块也可以被复制并用随机选择的垃圾指令填充。

你可能感兴趣的:(LLVM)