本文pass 很简单 目标只有一个打印函数名字
环境搭建参见我之前的博客
android ndk ollvm环境搭建_flygle~的博客-CSDN博客
通过以上操作我们已经搭建好了环境
在 Android.mk 配置一下 参数即可实现混淆 可以根据自己实际情况 开启混淆模式
以下参数是全开模式
LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla -mllvm -sobf
接下来 我们添加一个 新的命令模式暂且就叫 "myp"
命令的使用
LOCAL_CFLAGS += -mllvm -myp
命令确定了直接修改 ollvm 源码
1 首先进入ollvm 目录 \lib\Transforms\Obfuscation\
新建MyPass.cpp
#include "llvm/Transforms/Obfuscation/MyPass.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/CryptoUtils.h"
#define DEBUG_TYPE "flattening"
using namespace llvm;
// Stats
STATISTIC(MYPASSTEST, "Functions mypass test");
namespace {
struct MyPass : public FunctionPass {
static char ID; // Pass identification, replacement for typeid
bool flag;
MyPass() : FunctionPass(ID) {}
MyPass(bool flag) : FunctionPass(ID) { this->flag = flag; }
bool runOnFunction(Function &F);
};
}
//opt加载Pass用的
char MyPass::ID = 0;
static RegisterPass<MyPass> X("mypass", "Call graph mypass");
Pass *llvm::createMyPass(bool flag) { return new MyPass(flag); }
bool MyPass::runOnFunction(Function &F) {
Function *tmp = &F;
// Do we obfuscate
if (toObfuscate(flag, tmp, "myp")) {
//打印函数名字
errs() << "in myp " << F.getName() <<"\n";
}
return false;
}
Pass *llvm::createMyPass() { return new MyPass(); }
2 新建头文件 MyPass.h
头文件存放路径 include\llvm\Transforms\Obfuscation\MyPass.h
#ifndef _MyPass_INCLUDES_
#define _MyPass_INCLUDES_
// LLVM include
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Transforms/Utils/Local.h" // For DemoteRegToStack and DemotePHIToStack
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/CryptoUtils.h"
#include "llvm/Transforms/Obfuscation/Utils.h"
// Namespace
using namespace std;
namespace llvm {
Pass *createMyPass();
Pass *createMyPass(bool flag);
}
#endif
3 添加新的命令
进入 lib\Transforms\IPO\PassManagerBuilder.cpp
static cl::opt<bool> StringObf("sobf", cl::init(false), cl::desc("Enable the string obfuscation"));
//mytest “myp” 就是命令 可以随便修改
static cl::opt<bool> MyPass("myp", cl::init(false), cl::desc("Enable the MyPass"));
//找到 populateModulePassManager
void PassManagerBuilder::populateModulePassManager(
legacy::PassManagerBase &MPM) {
if (!PGOSampleUse.empty()) {
MPM.add(createPruneEHPass());
MPM.add(createSampleProfileLoaderPass(PGOSampleUse));
}
中间这一段源码 忽略 。。。。。
//添加pass
MPM.add(createMyPass(MyPass));
4 添加到编译列表
编辑lib\Transforms\Obfuscation\CMakeLists.txt
add_llvm_library(LLVMObfuscation
CryptoUtils.cpp
Substitution.cpp
BogusControlFlow.cpp
Utils.cpp
SplitBasicBlocks.cpp
Flattening.cpp
StringObfuscation.cpp
MyPass.cpp
)
add_dependencies(LLVMObfuscation intrinsics_gen)
编译ollvm 源码
最后附上编译效果 函数名字全部打印出来了