From 204599a70bfc3e752c6869f5ea6078b9c888e987 Mon Sep 17 00:00:00 2001 From: qux-bbb <1147635419@qq.com> Date: Sat, 3 Aug 2024 20:47:07 +0800 Subject: [PATCH] patterns: Added Lua 5.3 bytecode pattern (#285) --- README.md | 1 + patterns/lua53.hexpat | 107 ++++++++++++++++++++++ tests/patterns/test_data/lua53.hexpat.lua | Bin 0 -> 574 bytes 3 files changed, 108 insertions(+) create mode 100644 patterns/lua53.hexpat create mode 100644 tests/patterns/test_data/lua53.hexpat.lua diff --git a/README.md b/README.md index 4a7ae73..ac59acc 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | JPEG | `image/jpeg` | [`patterns/jpeg.hexpat`](patterns/jpeg.hexpat) | JPEG Image Format | | Lua 5.1 | | [`patterns/lua51.hexpat`](patterns/lua51.hexpat) | Lua 5.1 bytecode | | Lua 5.2 | | [`patterns/lua52.hexpat`](patterns/lua52.hexpat) | Lua 5.2 bytecode | +| Lua 5.3 | | [`patterns/lua53.hexpat`](patterns/lua53.hexpat) | Lua 5.3 bytecode | | Lua 5.4 | | [`patterns/lua54.hexpat`](patterns/lua54.hexpat) | Lua 5.4 bytecode | | LCE Savefile | | [`patterns/lcesave.hexpat`](patterns/lcesave.hexpat) | Minecraft Legacy Console Edition save file | | Mach-O | `application/x-mach-binary` | [`patterns/macho.hexpat`](patterns/macho.hexpat) | Mach-O executable | diff --git a/patterns/lua53.hexpat b/patterns/lua53.hexpat new file mode 100644 index 0000000..4dc25d2 --- /dev/null +++ b/patterns/lua53.hexpat @@ -0,0 +1,107 @@ +#pragma description Lua 5.3 bytecode + +import std.io; +import type.base; + +namespace impl { + fn format_LuaString(auto string) { + if (string.size == 0) { + return "None"; + } + return std::format("\"{}\"", string.data); + }; + + fn format_Constant(auto constant) { + return constant.data; + }; + + fn format_Version(auto ver) { + return std::format("Ver. {}.{}", ver.major, ver.minor); + }; +} +using LuaFunction; + +bitfield Version { + minor : 4; + major : 4; +} [[format("impl::format_Version")]]; + +struct LuaBinaryHeader { + char magic[4]; + Version version_number; + u8 format_version; + char LUAC_DATA[6]; + u8 size_of_int; + u8 size_of_size_t; + u8 size_of_Instruction; + u8 size_of_lua_Integer; + u8 sizeof_lua_Number; + type::Hex LUAC_INT; + double LUAC_NUM; +}; + +struct LuaString { + u8 size; + if (size > 0) { + char data[size-1]; + } +}[[format("impl::format_LuaString")]]; + +struct LuaConstant { + u8 type; + if (type == 0) { // LUA_TNIL + // NULL + } else if (type == 1) { // LUA_TBOOLEAN + u8 data; + } else if (type == 3) { // LUA_TNUMFLT + double data; + } else if (type == 0x13) { // LUA_TNUMINT + u64 data; + } else if (type == 4 || type == 0x14 ) { // LUA_TSHRSTR LUA_TLNGSTR + LuaString data; + } +}[[format("impl::format_Constant")]]; + +struct LuaUpvalue { + u8 instack; + u8 idx; +}; + +struct Vector { + u32 size; + T values[size]; +}; + +struct LocalVar { + LuaString varname; + u32 startpc; + u32 endpc; +}; + +struct LuaDebugInfo { + Vector lineInfo; + Vector local_vars; + Vector upvalues; +}; + +struct LuaFunction { + LuaString source; + u32 line_defined; + u32 last_line_defined; + u8 number_of_parameters; + u8 is_vararg; + u8 maxstacksize; + Vector code; + Vector constants; + Vector upvalues; + Vector protos; + LuaDebugInfo debugInfo; +}; + +struct LuaFile { + LuaBinaryHeader header; + u8 sizeupvalues; + LuaFunction func; +}; + +LuaFile file @ 0; diff --git a/tests/patterns/test_data/lua53.hexpat.lua b/tests/patterns/test_data/lua53.hexpat.lua new file mode 100644 index 0000000000000000000000000000000000000000..deb541dd82d382b85e7c5c90f28993c95a873406 GIT binary patch literal 574 zcmZut%T5A85bS|wc3ANpHRwSO#&{rp!z@Nm#)}D8vdAbT!>(DDAh#hte!#Q;vifEA z%m5PNY%1N=k4kTy+>YaWsDEyT#~}(7;-w9L?_wfZD04N+FZDQH)>-M4av`PRM#2q9 zIFrCQL=ecxa|29(nYn)9`=W?m9XFAi->@10ZyZ_>njasF?{}}+ax+ao^TFW?B3X8| zb1<+)brgADbw+uHysxxQkw0gHB==>l5)7y}NS+Waal^@YxL>AK`%nz0dEC_s@i9%Y z<}@0UG}ArAZk%Ct6i?^Eu^v1qMoWx7dIy9fN0C#o4$LG#LHSn!tVeFxD@(+eS2?L> z!|hWYz-}J?11}6vN#dbe4BE9y=lZT~oev1)+!9sF*AY@}0qb;a1>2Nc?98!C(PD1} Q_6qx(^)(Q69=KzE0W9854gdfE literal 0 HcmV?d00001