Skip to content

Commit 232192b

Browse files
author
Jason Mobarak
committed
Add patches for bug fixes and string encryption
1 parent 31f41d4 commit 232192b

File tree

4 files changed

+472
-1
lines changed

4 files changed

+472
-1
lines changed

build.bash

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ CMAKE_COMMAND="\
2222
-DCMAKE_BUILD_TYPE=Release \
2323
-DLLVM_INCLUDE_TESTS=OFF"
2424

25+
PATCH_COMMAND="git apply /patches/*.patch"
26+
2527
docker run -i -t --rm \
2628
-v $PWD/build:/work/build \
2729
-v $PWD/output/opt:/opt \
30+
-v $PWD/patches:/patches \
2831
arm-llvm-obf:base \
29-
/bin/bash -c "cd /work/build && $CMAKE_COMMAND && ninja -v && ninja -v install"
32+
/bin/bash -c "cd /work/obfuscator-llvm && $PATCH_COMMAND && cd /work/build && $CMAKE_COMMAND && ninja -v && ninja -v install"
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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

Comments
 (0)