Virtual machine execution
Luau operations are lowered into a custom virtual instruction set. Opcode IDs, operand layouts and runtime mappings can change between builds, so one solved build is not a permanent map for the next.
Morpheus transforms Luau into a virtualized, polymorphic runtime built to make static recovery and reusable devirtualization substantially harder.
Morpheus focuses on changing the structure a reverser has to recover, not covering normal Luau in visual noise.
Luau operations are lowered into a custom virtual instruction set. Opcode IDs, operand layouts and runtime mappings can change between builds, so one solved build is not a permanent map for the next.
The same source does not need to produce the same protected shape. Morpheus varies instruction mappings, decoder forms, packet layouts and control-flow structure between compilations.
Strings and runtime names can travel through stateful representations instead of remaining as obvious constants. Sensitive values can be reconstructed close to the point where they are actually consumed.
Virtual blocks can be fragmented and reconnected after lowering. Recovering the instruction stream is therefore not automatically the same thing as recovering the source program's original structure.
Selected call and data-flow chains can collapse into higher-level VM operations so the original sequence no longer exists as a simple instruction trail.
Instruction chains can be fused into larger semantics, then diversified again so fixed opcode signatures become less useful across builds.
Runtime structures can be assembled through intermediate descriptors instead of exposing one complete application prototype up front.
Names, literals, accesses and expressions are broken into temporary data-flow before virtualization to reduce obvious source-level structure.
Sensitive regions can receive isolated mappings and stronger local transformations without forcing the entire script through the heaviest profile.
The CLI reports parsing, lowering, VM generation, packing and final output stages as they happen, so long builds never feel like a black box.
MPS directives are consumed during compilation. They let a script mark values or entire functions for specialized protection without leaving an MPS runtime library inside the protected output.
local token = MPS.SECURESTR(
"InventoryService"
)
local run = MPS.VM_STRONG(
function(value)
return value + 1
end
)
run(41)
Current release: v1.0.0