Skip to content

Commit 68919a8

Browse files
committed
feat(llvm): LLVM 19.0.0 support obfuscation
1 parent db375e9 commit 68919a8

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

llvm-project/llvm/lib/Passes/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,19 @@ add_llvm_component_library(LLVMPasses
77
PassPlugin.cpp
88
StandardInstrumentations.cpp
99

10+
Obfuscation/Utils.cpp
11+
Obfuscation/CryptoUtils.cpp
12+
Obfuscation/ObfuscationOptions.cpp
13+
Obfuscation/BogusControlFlow.cpp
14+
Obfuscation/IPObfuscationContext.cpp
15+
Obfuscation/Flattening.cpp
16+
Obfuscation/StringEncryption.cpp
17+
Obfuscation/SplitBasicBlock.cpp
18+
Obfuscation/Substitution.cpp
19+
Obfuscation/IndirectBranch.cpp
20+
Obfuscation/IndirectCall.cpp
21+
Obfuscation/IndirectGlobalVariable.cpp
22+
1023
ADDITIONAL_HEADER_DIRS
1124
${LLVM_MAIN_INCLUDE_DIR}/llvm
1225
${LLVM_MAIN_INCLUDE_DIR}/llvm/Passes

llvm-project/llvm/lib/Passes/PassBuilder.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,16 @@
296296
#include "llvm/Transforms/Vectorize/SLPVectorizer.h"
297297
#include "llvm/Transforms/Vectorize/VectorCombine.h"
298298
#include <optional>
299+
// 引用 Obfuscation 相关文件
300+
#include "Obfuscation/BogusControlFlow.h" // 虚假控制流
301+
#include "Obfuscation/Flattening.h" // 控制流平坦化
302+
#include "Obfuscation/SplitBasicBlock.h" // 基本块分割
303+
#include "Obfuscation/Substitution.h" // 指令替换
304+
#include "Obfuscation/StringEncryption.h" // 字符串加密
305+
#include "Obfuscation/IndirectGlobalVariable.h" // 间接全局变量
306+
#include "Obfuscation/IndirectBranch.h" // 间接跳转
307+
#include "Obfuscation/IndirectCall.h" // 间接调用
308+
#include "Obfuscation/Utils.h" // 为了控制函数名混淆开关 (bool obf_function_name_cmd;)
299309

300310
using namespace llvm;
301311

@@ -367,6 +377,17 @@ class TriggerVerifierErrorPass
367377

368378
} // namespace
369379

380+
// 添加命令行支持
381+
static cl::opt<bool> s_obf_split("split", cl::init(false), cl::desc("SplitBasicBlock: split_num=3(init)"));
382+
static cl::opt<bool> s_obf_sobf("sobf", cl::init(false), cl::desc("String Obfuscation"));
383+
static cl::opt<bool> s_obf_fla("fla", cl::init(false), cl::desc("Flattening"));
384+
static cl::opt<bool> s_obf_sub("sub", cl::init(false), cl::desc("Substitution: sub_loop"));
385+
static cl::opt<bool> s_obf_bcf("bcf", cl::init(false), cl::desc("BogusControlFlow: application number -bcf_loop=x must be x > 0"));
386+
static cl::opt<bool> s_obf_ibr("ibr", cl::init(false), cl::desc("Indirect Branch"));
387+
static cl::opt<bool> s_obf_igv("igv", cl::init(false), cl::desc("Indirect Global Variable"));
388+
static cl::opt<bool> s_obf_icall("icall", cl::init(false), cl::desc("Indirect Call"));
389+
static cl::opt<bool> s_obf_fn_name_cmd("fncmd", cl::init(false), cl::desc("use function name control obfuscation(_ + command + _ | example: function_fla_bcf_)"));
390+
370391
PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
371392
std::optional<PGOOptions> PGOOpt,
372393
PassInstrumentationCallbacks *PIC)
@@ -409,6 +430,30 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
409430
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
410431
#include "llvm/Passes/MachinePassRegistry.def"
411432
}
433+
434+
//outs() << "[obf] registerPipelineStartEPCallback\n"; // 优化前
435+
//outs() << "[obf] registerOptimizerLastEPCallback\n"; // 优化后
436+
this->registerOptimizerLastEPCallback(
437+
[](llvm::ModulePassManager &MPM,
438+
llvm::OptimizationLevel Level) {
439+
outs() << "[obf] run.registerOptimizerLastEPCallback\n";
440+
obf_function_name_cmd = s_obf_fn_name_cmd;
441+
if (obf_function_name_cmd) {
442+
outs() << "[obf] enable function name control obfuscation(_ + command + _ | example: function_fla_)\n";
443+
}
444+
MPM.addPass(StringEncryptionPass(s_obf_sobf)); // 先进行字符串加密 出现字符串加密基本块以后再进行基本块分割和其他混淆 加大解密难度
445+
llvm::FunctionPassManager FPM;
446+
FPM.addPass(IndirectCallPass(s_obf_icall)); // 间接调用
447+
FPM.addPass(SplitBasicBlockPass(s_obf_split)); // 优先进行基本块分割
448+
FPM.addPass(FlatteningPass(s_obf_fla)); // 对于控制流平坦化
449+
FPM.addPass(SubstitutionPass(s_obf_sub)); // 指令替换
450+
FPM.addPass(BogusControlFlowPass(s_obf_bcf)); // 虚假控制流
451+
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
452+
MPM.addPass(IndirectBranchPass(s_obf_ibr)); // 间接指令 理论上间接指令应该放在最后
453+
MPM.addPass(IndirectGlobalVariablePass(s_obf_igv)); // 间接全局变量
454+
MPM.addPass(RewriteSymbolPass()); // 根据yaml信息 重命名特定symbols
455+
}
456+
);
412457
}
413458

414459
void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {

0 commit comments

Comments
 (0)