| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // Author: simon
- // Author: ynwdlxm@163.com
- // Date: 2024/4/5 15:52
- // Desc:
- // luac -v
- // Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
- //
- // (base) ➜ lua xxd -u -g 1 luac.out
- // 00000000: 1B 4C 75 61 53 00 19 93 0D 0A 1A 0A 04 08 04 08 .LuaS...........
- // 00000010: 08 78 56 00 00 00 00 00 00 00 00 00 00 00 28 77 .xV...........(w
- // 00000020: 40 01 11 40 68 65 6C 6C 6F 5F 77 6F 72 6C 64 2E @..@hello_world.
- // 00000030: 6C 75 61 00 00 00 00 00 00 00 00 00 01 02 04 00 lua.............
- // 00000040: 00 00 06 00 40 00 41 40 00 00 24 40 00 01 26 00 ....@.A@..$@..&.
- // 00000050: 80 00 02 00 00 00 04 06 70 72 69 6E 74 04 0D 48 ........print..H
- // 00000060: 65 6C 6C 6F 2C 20 57 6F 72 6C 64 01 00 00 00 01 ello, World.....
- // 00000070: 00 00 00 00 00 04 00 00 00 01 00 00 00 01 00 00 ................
- // 00000080: 00 01 00 00 00 01 00 00 00 00 00 00 00 01 00 00 ................
- // 00000090: 00 05 5F 45 4E 56 .._ENV
- package binchunk
- const (
- LUA_SIGNATURE = "\x1bLua"
- LUAC_VERSION = 0x53
- LUAC_FORMAT = 0
- LUAC_DATA = "\x19\x93\r\n\x1a\n"
- CINT_SIZE = 4
- CSZIET_SIZE = 8
- INSTRUCTION_SIZE = 4
- LUA_INTEGER_SIZE = 8
- LUA_NUMBER_SIZE = 8
- LUAC_INT = 0X5678
- LUAC_NUM = 370.5
- TAG_NIL = 0X00
- TAG_BOOLEAN = 0X01
- TAG_NUMBER = 0X03
- TAG_INTEGER = 0X13
- TAG_SHORT_STR = 0X04
- TAG_LONG_STR = 0X14
- )
- // Undump 解析二进制 chunk
- func Undump(data []byte) *Prototype {
- reader := &reader{data}
- reader.checkHeader() // 校验头部
- reader.readByte() // 跳过 Upvalue 数量
- return reader.readProto("") // 读取函数原型
- }
- type binaryChunk struct {
- header // 头部
- sizeUpvalues byte // 主函数 upvalue 数量 01
- mainFunc *Prototype // 主函数原型
- }
- type header struct {
- signature [4]byte // 签名 1B 4C 75 61(ESC L u a 的 ASCII 码)
- version byte // 版本号 大版本号 小版本号 发布版本号 Lua 5.3.6 5X16+4=83(0X53)
- format byte // 格式号 0
- luacData [6]byte // LUAC_DATA 0x1993 回车(0X0D) 换行(0X0A) 替换(0X1A) 换行(0X0A)
- cintSize byte // cint 在二进制 chunk 里占用的字节数 04
- sizetSize byte // size_t 在二进制 chunk 里占用的字节数 08
- instructionSize byte // Lua 虚拟机指令在二进制 chunk 里占用的字节数 04
- luaIntegerSize byte // Lua 整数在二进制 chunk 里占用的字节数 08
- luaNumberSize byte // Lua 浮点数在二进制 chunk 里占用的字节数 08
- luacInt int64 // 78 56 00 00 00 00 00 00
- luacNum float64 // 00 00 00 00 00 28 77 40
- }
- type Prototype struct {
- Source string // 源文件名
- LineDefined uint32 // 起止行号
- LastLineDefined uint32 // 起止行号
- NumParams byte // 固定参数个数
- IsVararg byte // 是否有变长参数
- MaxStackSize byte // 寄存器数量
- Code []uint32 // 指令表
- Constants []interface{} // 常量表
- Upvalues []Upvalue // Upvalue 表,每个元素占用 2 个字节
- Protos []*Prototype // 函数原型
- LineInfo []uint32
- LocVars []LocVar // 局部变量表
- UpvalueNames []string
- }
- type Upvalue struct {
- Instack byte
- Idx byte
- }
- type LocVar struct {
- VarName string
- StartPC uint32
- EndPC uint32
- }
|