LuaDecompy/README.md

62 lines
1.9 KiB
Markdown
Raw Normal View History

2022-08-11 20:54:19 +00:00
# LuaDecompy
2022-08-11 21:00:41 +00:00
An experimental Lua 5.1 dump decompiler (typically dumped using `luac -o <out.luac> <script.lua>`).
2022-08-11 20:54:19 +00:00
2022-08-11 21:56:42 +00:00
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.
2022-08-11 20:54:19 +00:00
## Example usage
```sh
2022-08-11 21:00:41 +00:00
> cat example.lua && luac5.1 -o example.luac example.lua
2022-08-14 06:36:05 +00:00
local total = 0
2022-08-11 21:00:41 +00:00
2022-08-14 06:36:05 +00:00
for i = 0, 9, 1 do
total = total + i
print(total)
end
2022-08-11 21:00:41 +00:00
> python main.py example.luac
2022-08-11 20:54:19 +00:00
example.luac
==== [[example.lua's constants]] ====
2022-08-14 06:36:05 +00:00
0: [NUMBER] 0.0
1: [NUMBER] 9.0
2: [NUMBER] 1.0
3: [STRING] print
==== [[example.lua's locals]] ====
2022-08-14 06:36:05 +00:00
R[0]: total
R[1]: (for index)
R[2]: (for limit)
R[3]: (for step)
R[4]: i
2022-08-11 20:54:19 +00:00
==== [[example.lua's dissassembly]] ====
2022-08-14 06:36:05 +00:00
[ 0] LOADK : R[0] K[0] ; load 0.0 into R[0]
[ 1] LOADK : R[1] K[0] ; load 0.0 into R[1]
[ 2] LOADK : R[2] K[1] ; load 9.0 into R[2]
[ 3] LOADK : R[3] K[2] ; load 1.0 into R[3]
[ 4] FORPREP : R[1] 4 ;
[ 5] ADD : R[0] R[0] R[4] ; add R[4] to R[0], place into R[0]
[ 6] GETGLOBAL : R[5] K[3] ; move _G["print"] into R[5]
[ 7] MOVE : 6 0 0 ; move R[0] into R[6]
[ 8] CALL : 5 2 1 ;
[ 9] FORLOOP : R[1] -5 ;
[ 10] RETURN : 0 1 0 ;
2022-08-11 20:54:19 +00:00
==== [[example.lua's decompiled source]] ====
2022-08-14 06:36:05 +00:00
local total = 0.0
for i = 0.0, 9.0, 1.0 do
total = (total + i)
print(total)
end
2022-08-11 20:54:19 +00:00
```