이한솔

전처리 Pass 추가

1 add_llvm_library( LLVMObfuscation MODULE 1 add_llvm_library( LLVMObfuscation MODULE
2 ReturnObfuscation.cpp 2 ReturnObfuscation.cpp
3 + PreProcess.cpp
3 4
4 DEPENDS 5 DEPENDS
5 intrinsics_gen 6 intrinsics_gen
......
1 +#include "llvm/Pass.h"
2 +#include "llvm/IR/Function.h"
3 +#include "llvm/IR/Module.h"
4 +#include "llvm/IR/Instructions.h"
5 +#include "llvm/Support/Alignment.h"
6 +#include "llvm/Support/raw_ostream.h"
7 +#include "llvm/IR/CFG.h"
8 +#include <fstream>
9 +#include <iostream>
10 +using namespace llvm;
11 +
12 +namespace {
13 + struct PreProcess : public FunctionPass {
14 + static char ID;
15 +
16 + PreProcess() : FunctionPass(ID) { }
17 + bool runOnFunction(Function &F) override {
18 + Module* mod = F.getParent();
19 + std::vector<Instruction *> instructions;
20 + std::vector<BasicBlock *> RetBlocks;
21 + bool inserted = false;
22 + std::ofstream functionFile("functions.txt", std::ios_base::app);
23 + if (functionFile.is_open()) {
24 + functionFile << F.getName().str() << "\n";
25 + functionFile.close();
26 + }
27 + for (auto &BB : F) {
28 + for (auto &I : BB) {
29 + if (I.getOpcode() == Instruction::Ret) {
30 + instructions.push_back(&I);
31 + }
32 + }
33 + }
34 + for (auto &I : instructions) {
35 + BasicBlock *BB = I->getParent();
36 + // One Instruction Basic Block has only one ret instructions
37 + if (!BB->size() < 2)
38 + {
39 + BasicBlock *retblock = BB->splitBasicBlock(I->getIterator(), "obfuscatedreturn");
40 + } else {
41 + BB->setName("obfuscatedreturn");
42 + }
43 + }
44 + return true;
45 + }
46 +
47 + }; // end of struct Hello
48 +} // end of anonymous namespace
49 +
50 +char PreProcess::ID = 0;
51 +
52 +static RegisterPass<PreProcess> X("preprocess", "Hello World Pass",
53 + false /* Only looks at CFG */,
54 + false /* Analysis Pass */);
...\ No newline at end of file ...\ No newline at end of file