From d35aa459a01c8736ce4d8320592e3c6b291b5cf2 Mon Sep 17 00:00:00 2001 From: xelz Date: Fri, 21 Jul 2017 09:51:31 +0800 Subject: [PATCH 1/5] fix split out of bounds bug --- lib/Transforms/Obfuscation/SplitBasicBlocks.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp index 4f6259668585..38583821e0d3 100644 --- a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp +++ b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp @@ -92,7 +92,7 @@ void SplitBasicBlock::split(Function *f) { } // Check splitN and current BB size - if ((size_t)splitN > curr->size()) { + if ((size_t)splitN >= curr->size()) { splitN = curr->size() - 1; } @@ -113,12 +113,12 @@ void SplitBasicBlock::split(Function *f) { BasicBlock *toSplit = curr; int last = 0; for (int i = 0; i < splitN; ++i) { + if(toSplit->size() < 2) + continue; for (int j = 0; j < test[i] - last; ++j) { ++it; } last = test[i]; - if(toSplit->size() < 2) - continue; toSplit = toSplit->splitBasicBlock(it, toSplit->getName() + ".split"); } From 2e1d2fb7b5c30ac69d9fbf057249e05dc6087223 Mon Sep 17 00:00:00 2001 From: xelz Date: Fri, 21 Jul 2017 12:42:15 +0800 Subject: [PATCH 2/5] fix split_num range --- lib/Transforms/Obfuscation/SplitBasicBlocks.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp index 38583821e0d3..61f977014712 100644 --- a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp +++ b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp @@ -54,9 +54,9 @@ Pass *llvm::createSplitBasicBlock(bool flag) { bool SplitBasicBlock::runOnFunction(Function &F) { // Check if the number of applications is correct - if (!((SplitNum > 1) && (SplitNum <= 10))) { - errs()<<"Split application basic block percentage\ - -split_num=x must be 1 < x <= 10"; + if (!((SplitNum >= 1) && (SplitNum <= 10))) { + errs()<<"Split application basic block x times\ + -split_num=x must be 1 <= x <= 10"; return false; } From b01dce3dd67047afb49dfec1288c5fb0f1c1d85d Mon Sep 17 00:00:00 2001 From: xelz Date: Fri, 21 Jul 2017 12:55:13 +0800 Subject: [PATCH 3/5] fix bug splitN incorrectly inherited from last BB --- lib/Transforms/Obfuscation/SplitBasicBlocks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp index 61f977014712..7a462e12494d 100644 --- a/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp +++ b/lib/Transforms/Obfuscation/SplitBasicBlocks.cpp @@ -73,7 +73,6 @@ bool SplitBasicBlock::runOnFunction(Function &F) { void SplitBasicBlock::split(Function *f) { std::vector origBB; - int splitN = SplitNum; // Save all basic blocks for (Function::iterator I = f->begin(), IE = f->end(); I != IE; ++I) { @@ -84,6 +83,7 @@ void SplitBasicBlock::split(Function *f) { IE = origBB.end(); I != IE; ++I) { BasicBlock *curr = *I; + int splitN = SplitNum; // No need to split a 1 inst bb // Or ones containing a PHI node From 0f7fc9618aaa78883996a4a970809a626c5affc1 Mon Sep 17 00:00:00 2001 From: xelz Date: Sun, 27 Aug 2017 22:48:27 +0800 Subject: [PATCH 4/5] fix debug info metadata clone bug --- lib/Transforms/Obfuscation/BogusControlFlow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Obfuscation/BogusControlFlow.cpp b/lib/Transforms/Obfuscation/BogusControlFlow.cpp index 5060294ed1fb..1b5ac4bcbfbb 100644 --- a/lib/Transforms/Obfuscation/BogusControlFlow.cpp +++ b/lib/Transforms/Obfuscation/BogusControlFlow.cpp @@ -235,9 +235,9 @@ namespace { // We do this way, so we don't have to adjust all the phi nodes, metadatas and so on // for the first block. We have to let the phi nodes in the first part, because they // actually are updated in the second part according to them. - BasicBlock::iterator i1 = basicBlock->begin(); + Instruction *i1 = &*basicBlock->begin(); if(basicBlock->getFirstNonPHIOrDbgOrLifetime()) - i1 = (BasicBlock::iterator)basicBlock->getFirstNonPHIOrDbgOrLifetime(); + i1 = basicBlock->getFirstNonPHIOrDbgOrLifetime(); Twine *var; var = new Twine("originalBB"); BasicBlock *originalBB = basicBlock->splitBasicBlock(i1, *var); @@ -326,7 +326,7 @@ namespace { // Loop over the operands of the instruction for(User::op_iterator opi = i->op_begin (), ope = i->op_end(); opi != ope; ++opi){ // get the value for the operand - Value *v = MapValue(*opi, VMap, RF_None, 0); + Value *v = MapValue(*opi, VMap, RF_NoModuleLevelChanges, 0); if (v != 0){ *opi = v; DEBUG_WITH_TYPE("gen", errs() << "bcf: Value's operand has been setted\n"); From 981d98c14e999872b88076428e08217634a187cd Mon Sep 17 00:00:00 2001 From: xelz Date: Sun, 27 Aug 2017 22:50:17 +0800 Subject: [PATCH 5/5] invoke instruction not supported --- lib/Transforms/Obfuscation/BogusControlFlow.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/Transforms/Obfuscation/BogusControlFlow.cpp b/lib/Transforms/Obfuscation/BogusControlFlow.cpp index 1b5ac4bcbfbb..bcf7911af7f0 100644 --- a/lib/Transforms/Obfuscation/BogusControlFlow.cpp +++ b/lib/Transforms/Obfuscation/BogusControlFlow.cpp @@ -136,6 +136,14 @@ namespace { errs()<<"BogusControlFlow application basic blocks percentage -bcf_prob=x must be 0 < x <= 100"; return false; } + std::vector orginalBBs; + // check for compatible + for (BasicBlock &bb : F.getBasicBlockList()) { + if (isa(bb.getTerminator())) { + return false; + } + } + // If fla annotations if(toObfuscate(flag,&F,"bcf")) { bogus(F);