Code Obfuscation / Deobfuscation
Obfuscation Techniques
- Control flow flattening — transform if/while/for into switch-based dispatcher
- String encryption — XOR/AES strings, decrypt at runtime
- Instruction substitution — replace simple ops with complex equivalents
- Opaque predicates — always-true/false conditions that look complex
- Dead code insertion — unreachable blocks that confuse static analysis
- Function splitting — break functions into fragments, reorder randomly
- Constant obfuscation — MBA (Mixed Boolean-Arithmetic) expressions
Deobfuscation Techniques
- Pattern matching — recognize standard flattening dispatch patterns
- Symbolic execution — angr/MIAsM to recover original control flow
- Dynamic analysis — trace execution, record actual path
- Taint analysis — track obfuscated values to source
- LLVM optimization passes — run -O3 on lifted IR
Execution
When triggered:
- Analyze target for obfuscation indicators (entropy, CFG complexity)
- Identify obfuscation type(s)
- Apply matching deobfuscation technique
- Or: apply obfuscation to protect sensitive code
- Write result to disk