Make Your Code Unreadable.
Keep It Functional.
A Python port of four existing C++ LLVM obfuscation frameworks, brought to modern LLVM via llvm-nanobind. 17 passes across 4 technique families — from arithmetic substitution to VM virtualization.
define i32 @add(i32 %a, i32 %b) {
entry:
%result = add i32 %a, %b
ret i32 %result
}Four Families of Protection
17 obfuscation passes ported to Python from four open-source C++ frameworks — some no longer maintained, all brought to modern LLVM
Ported from bluesadi's C++ framework (archived, last updated 2022, pinned to LLVM 14)
Ported from za233's C++ obfuscator — upgraded Pluto passes plus four new techniques
Ported from MrRoy09's C++ project — platform-specific techniques targeting strings and disassemblers
Built on thesecretclub's riscy-business C++ VM — translates functions to RISC-V bytecode with embedded interpreter
See the Transformation
Explore how each pass transforms LLVM IR
Simplified examples for illustration — real output varies with random seeds and pass composition
define i32 @add(i32 %a, i32 %b) {
entry:
%result = add i32 %a, %b
ret i32 %result
}; Pattern: a + b = (a + r) + b - r
define i32 @add(i32 %a, i32 %b) #0 {
entry:
%sub.ar = add i32 %a, -1447186197
%sub.arb = add i32 %sub.ar, %b
%result = sub i32 %sub.arb, -1447186197
ret i32 %result
}How It Works
Three steps from source to protected binary
Input LLVM IR
Compile your C/C++ source to LLVM bitcode with Clang, or load existing .bc files
Select & Compose Passes
Choose from 17 passes across Pluto, Polaris, VMwhere, and Virtualization — stack them freely
Output Protected Binary
Get an obfuscated binary that maintains full functionality with hardened protection
Why Shifting.Codes?
- Python-based via llvm-nanobind — no need to rebuild LLVM from source
- Built on LLVM, Z3, nanobind, and proven open-source obfuscation research
- Compose multiple passes for layered protection across all 4 families
- RISC-V inspired VM virtualizes functions into custom bytecode interpreters
- Anti-disassembly pass injects x86 junk bytes that break IDA, Ghidra, and objdump
- Makes code unreadable to mid-tier reverse engineering tools like IDA and Ghidra
Have questions or want to collaborate?