1use serde::{Deserialize, Serialize};
8
9pub const YAML_CONFIG_VERSION: &str = "1.0.6";
11
12#[derive(Debug, Serialize, Deserialize, Clone)]
14pub enum MutationEngineExtension {
15 Generic,
17 SSE3,
19 SSE42,
21}
22
23#[derive(Debug, Clone, Copy, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)]
25pub enum PeEnvironment {
26 UserMode,
28 KernelMode,
30 UEFI,
32}
33
34#[derive(Debug, Serialize, Deserialize, Clone)]
36pub struct LifterSettings {
37 pub lift_calls: bool,
39 pub calling_convention: String,
41 pub max_stack_copy_size: u32,
43 pub split_on_calls_fallback: bool,
45}
46
47#[derive(Debug, Serialize, Deserialize, Clone)]
49pub struct OptimizationSettings {
50 pub constant_propagation: bool,
52 pub instruction_combine: bool,
54 pub dead_code_elim: bool,
56 pub prune_useless_block_params: bool,
58 pub iterations: u32,
60}
61
62#[derive(Debug, Serialize, Deserialize, Clone)]
64pub struct AssemblerSettings {
65 pub shuffle_basic_blocks: bool,
67 pub instruction_prefix: String,
69 pub random_prefix_chance: f64,
71}
72
73#[derive(Debug, Serialize, Deserialize, Clone)]
75pub struct CompilerSettings {
76 pub assembler_settings: AssemblerSettings,
78 pub optimization_settings: OptimizationSettings,
80 pub lifter_settings: LifterSettings,
82}
83
84#[derive(Default, Debug, Serialize, Deserialize)]
86pub struct FakePdbString {
87 pub enabled: bool,
89 pub value: String,
91}
92
93#[derive(Default, Debug, Serialize, Deserialize)]
95pub struct CustomSectionName {
96 pub enabled: bool,
98 pub value: String,
100}
101
102#[derive(Debug, Serialize, Deserialize)]
104pub struct ModuleSettings {
105 #[serde(default)]
107 pub ida_crasher: bool,
108 #[serde(default)]
110 pub import_protection: bool,
111 #[serde(default)]
113 pub pack_output_file: bool,
114 #[serde(default)]
116 pub obscure_entry_point: bool,
117 #[serde(default)]
120 pub clear_unwind_info: bool,
121 #[serde(default)]
123 pub fake_pdb_string: FakePdbString,
124 #[serde(default)]
126 pub custom_section_name: CustomSectionName,
127}
128
129#[derive(Debug, Serialize, Deserialize, Clone)]
131pub struct Semantics {
132 #[serde(default)]
133 pub add: bool,
134 #[serde(default)]
135 pub sub: bool,
136 #[serde(default)]
137 pub and: bool,
138 #[serde(default)]
139 pub xor: bool,
140 #[serde(default)]
141 pub or: bool,
142 #[serde(default)]
143 pub not: bool,
144 #[serde(default)]
145 pub neg: bool,
146}
147
148#[derive(Debug, Serialize, Deserialize, Clone)]
150pub struct BitWidths {
151 #[serde(default)]
152 pub bit8: bool,
153 #[serde(default)]
154 pub bit16: bool,
155 #[serde(default)]
156 pub bit32: bool,
157 #[serde(default)]
158 pub bit64: bool,
159}
160
161#[derive(Debug, Serialize, Deserialize, Clone)]
165pub struct SsaOrigins {
166 pub normal: bool,
167 pub memop: bool,
168 pub fp_based_memop: bool,
169 pub sp_based_memop: bool,
170}
171
172#[derive(Debug, Serialize, Deserialize, Clone)]
174pub struct LoopEncodeSemantics {
175 pub iterations: u32,
177 pub probability: u32,
179 pub semantics: Semantics,
181 pub bitwidths: BitWidths,
183 pub ethnicities: SsaOrigins,
184}
185
186#[derive(Debug, Serialize, Deserialize, Clone)]
188pub struct MixedBooleanArithmetic {
189 pub iterations: u32,
190 pub probability: u32,
191 pub semantics: Semantics,
192 pub bitwidths: BitWidths,
193 pub ethnicities: SsaOrigins,
194}
195
196#[derive(Debug, Serialize, Deserialize, Clone)]
198pub struct MutationEngine {
199 pub iterations: u32,
200 pub probability: u32,
201 pub extension: MutationEngineExtension,
202 pub semantics: Semantics,
203 pub bitwidths: BitWidths,
204 pub ethnicities: SsaOrigins,
205}
206
207#[derive(Debug, Serialize, Deserialize, Clone)]
209pub struct IDADecompilerCrasher;
210
211#[derive(Debug, Serialize, Deserialize, Clone)]
213pub struct SuppressConstants {
214 pub mba_enhance: bool,
215 pub ethnicities: SsaOrigins,
216}
217
218#[derive(Debug, Serialize, Deserialize, Clone)]
221pub struct ObscureConstants {
222 pub mba_enhance: bool,
223 pub probability: u32,
224 pub iterations: u32,
225 pub bitwidths: BitWidths,
226 pub ethnicities: SsaOrigins,
227}
228
229#[derive(Debug, Serialize, Deserialize, Clone)]
231pub struct ObscureReferences {
232 pub mba_enhance: bool,
233}
234
235#[derive(Debug, Serialize, Deserialize, Clone)]
237pub struct ObscureControlFlow {
238 pub mba_enhance: bool,
239 pub probability: u32,
240}
241
242#[derive(Debug, Serialize, Deserialize, Clone)]
244pub struct TetherExtraction {
245 pub min_extract_len: usize,
248 pub endpoint: String,
250 pub port: u16,
252 pub server_public_key: String,
255}
256
257#[derive(Debug, Serialize, Deserialize, Clone)]
259pub struct OpaqueBlockDuplication {
260 pub iterations: u32,
262 pub probability: u32,
264}
265
266#[derive(Debug, Serialize, Deserialize, Clone)]
268pub struct SplitBlockPass {
269 pub threshold: u32,
271}
272
273#[derive(Debug, Serialize, Deserialize, Clone)]
275pub struct LeaEncodeImm {
276 pub mba_enhance: bool,
277 pub iterations: u32,
279 pub probability: u32,
281 pub ethnicities: SsaOrigins,
282}
283
284#[derive(Debug, Serialize, Deserialize, Clone)]
285pub struct SigBreaker {
286 pub shuffle_insts: bool,
287 pub random_segment_selector: bool,
288 pub calling_convention: String,
290}
291
292#[derive(Debug, Serialize, Deserialize, Clone)]
294#[serde(tag = "type")]
295pub enum ObfuscationPass {
296 LoopEncodeSemantics(LoopEncodeSemantics),
297 MixedBooleanArithmetic(MixedBooleanArithmetic),
298 MutationEngine(MutationEngine),
299 TetherExtraction(TetherExtraction),
300 SplitBlockPass(SplitBlockPass),
301 OpaqueBlockDuplication(OpaqueBlockDuplication),
302 ObscureControlFlow(ObscureControlFlow),
303 LeaEncodeImm(LeaEncodeImm),
304 ObscureConstants(ObscureConstants),
305 SuppressConstants(SuppressConstants),
306 ObscureReferences(ObscureReferences),
307 SigBreaker(SigBreaker),
308 IDADecompilerCrasher,
309 AntiEmulator,
310}
311
312#[derive(Debug, Serialize, Deserialize)]
314pub struct Profile {
315 pub name: String,
317 pub passes: Vec<ObfuscationPass>,
319 pub compiler_settings: CompilerSettings,
321 pub symbols: Vec<u64>,
323}
324
325#[derive(Debug, Serialize, Deserialize)]
327pub struct Config {
328 pub module_settings: ModuleSettings,
330 pub profiles: Vec<Profile>,
332}
333
334#[derive(Deserialize, Serialize, Clone, Debug)]
336pub struct AnalysisFunction {
337 pub rva: u64,
339 pub symbol: String,
341 pub ref_count: usize,
343}
344
345#[derive(Deserialize, Serialize, Clone, Debug)]
347pub struct AnalysisReject {
348 pub rva: u64,
350 pub symbol: String,
352 pub ty: String,
354 pub reason: String,
356}
357
358#[derive(Deserialize, Serialize, Clone, Debug)]
360pub struct AnalysisMacroProfile {
361 pub name: String,
363 pub rvas: Vec<u64>,
365}
366
367#[derive(Deserialize, Serialize, Clone, Debug)]
369pub struct AnalysisResult {
370 pub environment: PeEnvironment,
372 pub functions: Vec<AnalysisFunction>,
374 pub rejects: Vec<AnalysisReject>,
376 pub macros: Vec<AnalysisMacroProfile>,
378}
379
380#[derive(Deserialize, Serialize, Clone, Debug)]
381pub struct DisassemblySettings {
382 pub allow_code_reads_and_writes: bool,
383 pub allow_unknown_indirect_jumps: bool,
384 pub allow_mismatched_branch_counts: bool,
385 pub thunk_mismatched_branch_counts: bool,
386 pub thunk_branch_target_identifiers: bool,
387 pub thunk_no_prev_block: bool,
388 pub thunk_data_references: bool,
389 pub always_thunk_entry: bool,
390 pub follow_faulting_instructions: bool,
391 pub pass_interrupts: bool,
392 pub pass_exceptions: bool,
393 pub aggressive_pointer_analysis: bool,
394 pub perform_relocation_analysis: bool,
395 pub explore_catch_funclet_continuations: bool,
396}
397
398#[derive(Debug, Serialize, Deserialize)]
400pub enum YamlSymbol {
401 Name(String),
403 Rva(u64),
405}
406
407#[derive(Debug, Serialize, Deserialize)]
409pub struct YamlProfile {
410 pub name: String,
412 pub passes: Vec<ObfuscationPass>,
414 pub compiler_settings: CompilerSettings,
416 pub symbols: Vec<YamlSymbol>,
418}
419
420#[derive(Debug, Serialize, Deserialize)]
422pub struct YamlConfig {
423 pub version: String,
425 pub disassembly_settings: DisassemblySettings,
427 pub module_settings: ModuleSettings,
429 pub profiles: Vec<YamlProfile>,
431}