metaworm/luac-parser-rs

parse luac: Error

weituotian opened this issue · 8 comments

parse luac: Error(
    Stack {
        base: Base {
            location: 50,
            kind: Kind(
                Switch,
            ),
        },
        contexts: [
            (
                50,
                Kind(
                    Count,
                ),
            ),
            (
                46,
                Context(
                    "count instruction",
                ),
            ),
            (
                46,
                Context(
                    "chunk",
                ),
            ),
        ],
    },
)

luac文件:
Post_G3_Co_Fog.zip

我研究了一下,发现不是官方的lua字节码格式,luac部分代码应该是被人为修改过的

https://github.com/metaworm/luac-parser-rs/blob/master/src/lib.rs#L276 处的代码修改为

           map(
                tuple((
                    tag(b"\x53"),
                    be_u8,
                    take(6usize), // LUAC_DATA
                    // be_u8,
                    be_u8,
                    be_u8,
                    be_u8,
                    be_u8,
                    complete::le_i64,
                    complete::le_f64,
                    be_u8,
                )),
                |(
                    _,
                    format_version,
                    _luac_data,
                    // int_size,
                    size_t_size,
                    instruction_size,
                    _integer_size, // lua_Integer
                    number_size,
                    _,
                    _,
                    _,
                )| LuaHeader {
                    lua_version: LUA53,
                    format_version,
                    big_endian: cfg!(target_endian = "big"),
                    int_size: 4,
                    size_t_size,
                    instruction_size,
                    number_size,
                    number_integral: false,
                    ..Default::default()
                },
            ),

可以解析

不确定其他地方有没有动过手脚,需要你自行判断

@metaworm 是一个游戏提取的luac, 我尝试用修改这个仓库https://github.com/metaworm/openwrt-luac-parser
来编译wasm,但是好像没有 take(6usize), // LUAC_DATA 这个函数,我应该怎么处理

已经成功编译了,但是在使用https://luadec.metaworm.site/
时会报另一个错误

custom parser: RuntimeError: unreachable

这是我的wasm和luac文件
Z.zip

@weituotian parser的源代码发我看一下 metaworm@outlook.com

已发送

收到了,我本地编译出来的wasm加载使用是没有问题的,也通过邮件发给你了;

另外你提供的luac的字节码指令是被修改过的,有些opcode超出了正常的范围,反编译结果中显示为-- todo: Invalid
要想达到最好的反编译效果,需要你逆向分析出他的opcode和官方opcode的映射关系,并在parser的指令解析部分中还原成官方的opcode,可以参考 openwrt-luac-parser 项目中 custom.rs 文件中相关代码的处理

收到,我再去研究一下opcode的原理