LuaDecompy/README.md

57 lines
1.8 KiB
Markdown

# LuaDecompy
An experimental Lua 5.1 dump decompiler (typically dumped using `luac -o <out.luac> <script.lua>`).
You will quickly find that only **extremely** simple scripts are decompiled successfully right now. This is an experimental project and not all opcodes are properly handled for now. If you need a real decompiler I would recommend any of the handful of ones that exist already.
## Why?
Lua has a relatively small instruction set (only 38 different opcodes!). This makes it pretty feasible for a weekend decompiler project. (real) Decompilers are extremely complex pieces of software, so being able to write a simpler one helps show the theory without *much* of the headache.
## Example usage
```sh
> cat example.lua && luac5.1 -o example.luac example.lua
i = 0
while i < 10 do
print(i)
i = i + 1
end
> python main.py example.luac
example.luac
==== [[example.lua's constants]] ====
0: [STRING] i
1: [NUMBER] 0.0
2: [NUMBER] 10.0
3: [STRING] print
4: [NUMBER] 1.0
==== [[example.lua's dissassembly]] ====
[ 0] LOADK : R[0] K[1] ; load 0.0 into R[0]
[ 1] SETGLOBAL : R[0] K[0] ;
[ 2] GETGLOBAL : R[0] K[0] ;
[ 3] LT : R[0] R[0] K[2] ;
[ 4] JMP : R[0] 7 ;
[ 5] GETGLOBAL : R[0] K[3] ;
[ 6] GETGLOBAL : R[1] K[0] ;
[ 7] CALL : R[0] 2 1 ;
[ 8] GETGLOBAL : R[0] K[0] ;
[ 9] ADD : R[0] R[0] K[4] ;
[ 10] SETGLOBAL : R[0] K[0] ;
[ 11] JMP : R[0] -10 ;
[ 12] RETURN : R[0] 1 0 ;
==== [[example.lua's decompiled source]] ====
i = 0.0
while i < 10.0 do
print(i)
i = (i + 1.0)
end
```