ollvm 添加新的命令参数并编写第一个pass

本文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 源码 

最后附上编译效果 函数名字全部打印出来了

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值