为ollvm 4.0 集成字符串混淆Pass

@author qtfreet00
@time 2017-07-02
@location mars

ollvm是款非常棒的native混淆器,在llvm编译器上加上了流程混淆pass,再看到上交开源了他们改造的llvm,在其基础上加上了字符串混淆功能。

pass示例:
http://www.nagain.com/activity/article/14/

不过自己也不会写pass,也没集成过,直接尝试摸鱼

孤挺花的字符串pass位置位于Armariris/lib/Transforms/Obfuscation/下

直接搜索StringObfuscation.cpp所对应的调用

最后流程
复制StringObfuscation.cpp 到 Ollvm对应目录,将StringObfuscation.h复制到ollvm的头文件目录下

CmakeLists.txt下添加 StringObfuscation.cpp的引用

最后在Armariris/lib/Transforms/IPO/PassManagerBuilder.cpp添加字符串混淆的功能

引入#include "llvm/Transforms/Obfuscation/StringObfuscation.h"

添加两函数声明

// Flags for obfuscation

static cl::opt Seed("seed", cl::init(""),
cl::desc("seed for the random"));

static cl::opt StringObf("sobf", cl::init(false),
cl::desc("Enable the string obfuscation"));

在构造函数下添加

if(!Seed.empty()) {
    llvm::cryptoutils->prng_seed(Seed.c_str());
}

用作随机数因子

最后在
void PassManagerBuilder::populateModulePassManager

下添加一条

MPM.add(createStringObfuscation(StringObf));

即将字符串混淆添加到编译选项中即可

重新执行make -j4

目前孤挺花的字符串识别还存在一个bug,即不会加密每个函数的第一个字符串,其它未发现问题,已经和开发者说明问题,回复了明天更新

成品

qtfreet00

发表评论

电子邮件地址不会被公开。 必填项已用*标注