A C compiler that reduces programs to only 'mov' instructions, demonstrating Turing-completeness and enabling extreme obfuscation.
M/o/Vfuscator is a C compiler that translates programs into executables using only the x86 'mov' (move) instruction. It proves that 'mov' is Turing-complete, meaning any computation can be expressed through data movement alone. The compiler transforms arithmetic, logic, control flow, and function calls into complex sequences of 'mov' operations, creating heavily obfuscated binaries.
Low-level programmers, compiler enthusiasts, and security researchers interested in obfuscation techniques, unconventional computing models, or educational demonstrations of Turing-completeness.
It offers a unique, extreme form of code obfuscation by eliminating traditional control flow and arithmetic instructions, making reverse engineering exceptionally difficult. As a proof-of-concept, it provides deep insights into compiler design and the theoretical limits of minimal instruction sets.
The single instruction C compiler
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Handles a full C89 subset, including floating-point arithmetic via an optional emulation library (softfloat32.o, etc.), as specified in the README.
Implements jumps, loops, and function calls through mov operations, flattening control flow graphs and making reverse engineering exceptionally difficult, as shown in the overview images.
Includes scripts to transform output into other minimal instruction sets like XOR or ADD, and RISC-like data transfers, enhancing obfuscation options for research or challenges.
Demonstrates that mov is Turing-complete, providing deep insights into compiler theory and minimal instruction sets, inspired by Stephen Dolan's paper.
LCC is a C89 compiler, so C99 features like bool, for (int ...), or mid-block variable declarations cause compilation errors, limiting use with modern code.
The use of lookup tables for arithmetic leads to large binary sizes and slow execution; the README notes symbol tables can be extremely large, requiring stripping with -s.
Calls to external libraries can clobber registers, and function pointers to external functions are not implemented, requiring workarounds like internal wrapping, as admitted in the Limitations section.