-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathPlugin.cpp
More file actions
150 lines (144 loc) · 5.98 KB
/
Copy pathPlugin.cpp
File metadata and controls
150 lines (144 loc) · 5.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//===- Plugin.cpp - Kilij pass plugin ------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE for details.
//
// Copyright (c) 2026 Danny Mundy
//
//===----------------------------------------------------------------------===//
//
// Registers obfuscation passes with LLVM's pass plugin interface.
//
//===----------------------------------------------------------------------===//
#include "BogusControlFlow.h"
#include "ConstObfuscation.h"
#include "Flattening.h"
#include "IATObfuscation.h"
#include "IndirectBranch.h"
#include "MBAObfuscation.h"
#include "SplitBasicBlock.h"
#include "StringObfuscation.h"
#include "Substitution.h"
#include "Utils.h"
#include "VM/VMPass.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
using namespace llvm;
llvm::PassPluginLibraryInfo getKilijPluginInfo() {
return {
LLVM_PLUGIN_API_VERSION, "Kilij", LLVM_VERSION_STRING,
[](PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](StringRef Name, ModulePassManager &MPM,
ArrayRef<PassBuilder::PipelineElement>) {
// Convenience: a single pipeline element that matches the
// OptimizerLast ordering used by the plugin callback.
if (Name == "kilij") {
MPM.addPass(obfvm::VMPass());
MPM.addPass(IATObfuscationPass());
MPM.addPass(StringObfuscationPass());
MPM.addPass(
createModuleToFunctionPassAdaptor(ConstObfuscationPass()));
MPM.addPass(
createModuleToFunctionPassAdaptor(SplitBasicBlockPass()));
MPM.addPass(
createModuleToFunctionPassAdaptor(BogusControlFlowPass()));
MPM.addPass(createModuleToFunctionPassAdaptor(FlatteningPass()));
MPM.addPass(createModuleToFunctionPassAdaptor(MBAObfuscationPass()));
MPM.addPass(IndirectBranchPass());
MPM.addPass(createModuleToFunctionPassAdaptor(SubstitutionPass()));
return true;
}
// Function passes (module->function adaptor so opt -passes='fla,...'
// works as expected).
if (Name == "fla") {
forceObfuscationPass("fla");
MPM.addPass(createModuleToFunctionPassAdaptor(FlatteningPass()));
return true;
}
if (Name == "bcf") {
forceObfuscationPass("bcf");
MPM.addPass(
createModuleToFunctionPassAdaptor(BogusControlFlowPass()));
return true;
}
if (Name == "split") {
forceObfuscationPass("split");
MPM.addPass(
createModuleToFunctionPassAdaptor(SplitBasicBlockPass()));
return true;
}
if (Name == "sub") {
forceObfuscationPass("sub");
MPM.addPass(createModuleToFunctionPassAdaptor(SubstitutionPass()));
return true;
}
if (Name == "mba") {
forceObfuscationPass("mba");
MPM.addPass(createModuleToFunctionPassAdaptor(MBAObfuscationPass()));
return true;
}
if (Name == "const" || Name == "obf-const") {
forceObfuscationPass("const");
MPM.addPass(
createModuleToFunctionPassAdaptor(ConstObfuscationPass()));
return true;
}
// Module passes.
if (Name == "str" || Name == "obf-str") {
forceObfuscationPass("obf-str");
MPM.addPass(StringObfuscationPass());
return true;
}
if (Name == "iat" || Name == "obf-iat") {
forceObfuscationPass("obf-iat");
MPM.addPass(IATObfuscationPass());
return true;
}
if (Name == "indbr") {
forceObfuscationPass("indbr");
MPM.addPass(IndirectBranchPass());
return true;
}
if (Name == "indcall") {
forceObfuscationPass("indcall");
MPM.addPass(IndirectBranchPass());
return true;
}
if (Name == "vm") {
// VM is configured via -mllvm -vm-mode=...; parsing "vm" just
// inserts the pass into the pipeline.
MPM.addPass(obfvm::VMPass());
return true;
}
return false;
});
// Run obfuscation passes late to avoid cleanup/IC folding them away.
PB.registerOptimizerLastEPCallback([](llvm::ModulePassManager &MPM,
OptimizationLevel Level,
ThinOrFullLTOPhase) {
(void)Level;
// VM first so later passes see the transformed surface.
MPM.addPass(obfvm::VMPass());
MPM.addPass(IATObfuscationPass());
MPM.addPass(StringObfuscationPass());
MPM.addPass(
createModuleToFunctionPassAdaptor(ConstObfuscationPass()));
MPM.addPass(createModuleToFunctionPassAdaptor(SplitBasicBlockPass()));
MPM.addPass(
createModuleToFunctionPassAdaptor(BogusControlFlowPass()));
MPM.addPass(createModuleToFunctionPassAdaptor(FlatteningPass()));
MPM.addPass(createModuleToFunctionPassAdaptor(MBAObfuscationPass()));
MPM.addPass(IndirectBranchPass());
MPM.addPass(createModuleToFunctionPassAdaptor(SubstitutionPass()));
});
}};
}
#if !defined(LLVM_OBFUSCATION_LINK_INTO_TOOLS) || defined(KILIJ_BUILD_PASS_PLUGIN)
extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
return getKilijPluginInfo();
}
#endif