|
| 1 | +From 05c3ca6986ce1797b1d432f34abdf7790f258a9b Mon Sep 17 00:00:00 2001 |
| 2 | +From: Jason Mobarak < [email protected]> |
| 3 | +Date: Mon, 16 Oct 2017 14:55:35 -0700 |
| 4 | +Subject: [PATCH 1/2] Port bcf bugfixes from |
| 5 | + https://github.com/obfuscator-llvm/obfuscator/pull/76 |
| 6 | + |
| 7 | +--- |
| 8 | + lib/Transforms/Obfuscation/BogusControlFlow.cpp | 14 +++++++++++--- |
| 9 | + lib/Transforms/Obfuscation/SplitBasicBlocks.cpp | 14 +++++++------- |
| 10 | + 2 files changed, 18 insertions(+), 10 deletions(-) |
| 11 | + |
| 12 | +diff --git a/lib/Transforms/Obfuscation/BogusControlFlow.cpp b/lib/Transforms/Obfuscation/BogusControlFlow.cpp |
| 13 | +index 5060294..bcf7911 100644 |
| 14 | +--- a/lib/Transforms/Obfuscation/BogusControlFlow.cpp |
| 15 | ++++ b/lib/Transforms/Obfuscation/BogusControlFlow.cpp |
| 16 | +@@ -136,6 +136,14 @@ namespace { |
| 17 | + errs()<<"BogusControlFlow application basic blocks percentage -bcf_prob=x must be 0 < x <= 100"; |
| 18 | + return false; |
| 19 | + } |
| 20 | ++ std::vector<BasicBlock *> orginalBBs; |
| 21 | ++ // check for compatible |
| 22 | ++ for (BasicBlock &bb : F.getBasicBlockList()) { |
| 23 | ++ if (isa<InvokeInst>(bb.getTerminator())) { |
| 24 | ++ return false; |
| 25 | ++ } |
| 26 | ++ } |
| 27 | ++ |
| 28 | + // If fla annotations |
| 29 | + if(toObfuscate(flag,&F,"bcf")) { |
| 30 | + bogus(F); |
| 31 | +@@ -235,9 +243,9 @@ namespace { |
| 32 | + // We do this way, so we don't have to adjust all the phi nodes, metadatas and so on |
| 33 | + // for the first block. We have to let the phi nodes in the first part, because they |
| 34 | + // actually are updated in the second part according to them. |
| 35 | +- BasicBlock::iterator i1 = basicBlock->begin(); |
| 36 | ++ Instruction *i1 = &*basicBlock->begin(); |
| 37 | + if(basicBlock->getFirstNonPHIOrDbgOrLifetime()) |
| 38 | +- i1 = (BasicBlock::iterator)basicBlock->getFirstNonPHIOrDbgOrLifetime(); |
| 39 | ++ i1 = basicBlock->getFirstNonPHIOrDbgOrLifetime(); |
| 40 | + Twine *var; |
| 41 | + var = new Twine("originalBB"); |
| 42 | + BasicBlock *originalBB = basicBlock->splitBasicBlock(i1, *var); |
| 43 | +@@ -326,7 +334,7 @@ namespace { |
| 44 | + // Loop over the operands of the instruction |
| 45 | + for(User::op_iterator opi = i->op_begin (), ope = i->op_end(); opi != ope; ++opi){ |
| 46 | + // get the value for the operand |
| 47 | +- Value *v = MapValue(*opi, VMap, RF_None, 0); |
| 48 | ++ Value *v = MapValue(*opi, VMap, RF_NoModuleLevelChanges, 0); |
| 49 | + if (v != 0){ |
| 50 | + *opi = v; |
| 51 | + DEBUG_WITH_TYPE("gen", errs() << "bcf: Value's operand has been setted\n"); |
| 52 | +diff --git a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp |
| 53 | +index 4f62596..7a462e1 100644 |
| 54 | +--- a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp |
| 55 | ++++ b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp |
| 56 | +@@ -54,9 +54,9 @@ Pass *llvm::createSplitBasicBlock(bool flag) { |
| 57 | + |
| 58 | + bool SplitBasicBlock::runOnFunction(Function &F) { |
| 59 | + // Check if the number of applications is correct |
| 60 | +- if (!((SplitNum > 1) && (SplitNum <= 10))) { |
| 61 | +- errs()<<"Split application basic block percentage\ |
| 62 | +- -split_num=x must be 1 < x <= 10"; |
| 63 | ++ if (!((SplitNum >= 1) && (SplitNum <= 10))) { |
| 64 | ++ errs()<<"Split application basic block x times\ |
| 65 | ++ -split_num=x must be 1 <= x <= 10"; |
| 66 | + return false; |
| 67 | + } |
| 68 | + |
| 69 | +@@ -73,7 +73,6 @@ bool SplitBasicBlock::runOnFunction(Function &F) { |
| 70 | + |
| 71 | + void SplitBasicBlock::split(Function *f) { |
| 72 | + std::vector<BasicBlock *> origBB; |
| 73 | +- int splitN = SplitNum; |
| 74 | + |
| 75 | + // Save all basic blocks |
| 76 | + for (Function::iterator I = f->begin(), IE = f->end(); I != IE; ++I) { |
| 77 | +@@ -84,6 +83,7 @@ void SplitBasicBlock::split(Function *f) { |
| 78 | + IE = origBB.end(); |
| 79 | + I != IE; ++I) { |
| 80 | + BasicBlock *curr = *I; |
| 81 | ++ int splitN = SplitNum; |
| 82 | + |
| 83 | + // No need to split a 1 inst bb |
| 84 | + // Or ones containing a PHI node |
| 85 | +@@ -92,7 +92,7 @@ void SplitBasicBlock::split(Function *f) { |
| 86 | + } |
| 87 | + |
| 88 | + // Check splitN and current BB size |
| 89 | +- if ((size_t)splitN > curr->size()) { |
| 90 | ++ if ((size_t)splitN >= curr->size()) { |
| 91 | + splitN = curr->size() - 1; |
| 92 | + } |
| 93 | + |
| 94 | +@@ -113,12 +113,12 @@ void SplitBasicBlock::split(Function *f) { |
| 95 | + BasicBlock *toSplit = curr; |
| 96 | + int last = 0; |
| 97 | + for (int i = 0; i < splitN; ++i) { |
| 98 | ++ if(toSplit->size() < 2) |
| 99 | ++ continue; |
| 100 | + for (int j = 0; j < test[i] - last; ++j) { |
| 101 | + ++it; |
| 102 | + } |
| 103 | + last = test[i]; |
| 104 | +- if(toSplit->size() < 2) |
| 105 | +- continue; |
| 106 | + toSplit = toSplit->splitBasicBlock(it, toSplit->getName() + ".split"); |
| 107 | + } |
| 108 | + |
| 109 | +-- |
| 110 | +2.7.4 |
| 111 | + |
0 commit comments