1use serde::{Deserialize, Serialize};
8
9pub const YAML_CONFIG_VERSION: &str = "1.0.5";
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 CDCompilerSettings {
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 CDModuleSettings {
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)]
286#[serde(tag = "type")]
287pub enum ObfuscationPass {
288 LoopEncodeSemantics(LoopEncodeSemantics),
289 MixedBooleanArithmetic(MixedBooleanArithmetic),
290 MutationEngine(MutationEngine),
291 TetherExtraction(TetherExtraction),
292 SplitBlockPass(SplitBlockPass),
293 OpaqueBlockDuplication(OpaqueBlockDuplication),
294 ObscureControlFlow(ObscureControlFlow),
295 LeaEncodeImm(LeaEncodeImm),
296 ObscureConstants(ObscureConstants),
297 SuppressConstants(SuppressConstants),
298 ObscureReferences(ObscureReferences),
299 IDADecompilerCrasher,
300 AntiEmulator,
301 SigBreaker,
302}
303
304#[derive(Debug, Serialize, Deserialize)]
306pub struct CDProfile {
307 pub name: String,
309 pub passes: Vec<ObfuscationPass>,
311 pub compiler_settings: CDCompilerSettings,
313 pub symbols: Vec<u64>,
315}
316
317#[derive(Debug, Serialize, Deserialize)]
319pub struct CDConfig {
320 pub module_settings: CDModuleSettings,
322 pub profiles: Vec<CDProfile>,
324}
325
326#[derive(Deserialize, Serialize, Clone, Debug)]
328pub struct AnalysisFunction {
329 pub rva: u64,
331 pub symbol: String,
333 pub ref_count: usize,
335}
336
337#[derive(Deserialize, Serialize, Clone, Debug)]
339pub struct AnalysisReject {
340 pub rva: u64,
342 pub symbol: String,
344 pub ty: String,
346 pub reason: String,
348}
349
350#[derive(Deserialize, Serialize, Clone, Debug)]
352pub struct AnalysisMacroProfile {
353 pub name: String,
355 pub rvas: Vec<u64>,
357}
358
359#[derive(Deserialize, Serialize, Clone, Debug)]
361pub struct AnalysisResult {
362 pub environment: PeEnvironment,
364 pub functions: Vec<AnalysisFunction>,
366 pub rejects: Vec<AnalysisReject>,
368 pub macros: Vec<AnalysisMacroProfile>,
370}
371
372#[derive(Debug, Serialize, Deserialize)]
374pub enum YamlSymbol {
375 Name(String),
377 Rva(u64),
379}
380
381#[derive(Debug, Serialize, Deserialize)]
383pub struct YamlProfile {
384 pub name: String,
386 pub passes: Vec<ObfuscationPass>,
388 pub compiler_settings: CDCompilerSettings,
390 pub symbols: Vec<YamlSymbol>,
392 pub color: Option<String>,
394}
395
396#[derive(Debug, Serialize, Deserialize)]
398pub struct YamlConfig {
399 pub version: String,
401 pub module_settings: CDModuleSettings,
403 pub profiles: Vec<YamlProfile>,
405}