无法确定此文件的 Lua 格式

目前,我正在尝试阅读一个 Lua 文件,该文件以 .lua 结尾,但是当我打开它时,它似乎是一些奇怪格式的字节码。当前,唯一易读的字节码以 \ 27LuaQ 开始,没有次要代码和字节序等等。

Exception in thread "main" java.lang.IllegalStateException: The input chunk reports a non-standard lua format: 1
    at unluac.parse.LHeaderType.parse_format(LHeaderType.java:87)
    at unluac.parse.LHeaderType51.parse_main(LHeaderType.java:338)
    at unluac.parse.LHeaderType.parse(LHeaderType.java:67)
    at unluac.parse.BHeader.<init>(BHeader.java:84)
    at unluac.Main.file_to_function(Main.java:116)
    at unluac.Main.main(Main.java:58)

我花了几个小时来测试,赋予一个功能性字节码,以查看是否在编译时出错。然而,无论我做什么,所有反编译器都无法工作。我已经尝试过 unluac、chunkspy 和 luadec,它们的结果都是字节码标题格式不当。没有一个能反编译或分析。研究此文件,我发现对于字节码文件来说,有很多填充(0x00)被替换为 0x20,我认为这是 ' '。还要注意的是,该文件具有 LuaQ,这是我的一个错误,我忘了将其编辑回来。原先是 LupQ,我认为这可能是一项安全措施,但我不确定我是否正确。

目前,我的结论是,可能是我遗漏了一些重要和基础知识,任何信息都有所帮助。我已经包含了一个可以下载代码文件的链接。

该文件属于 Petroglyph 制作的老 PC 游戏:《星球大战:帝国战争》(2006 年),因此编译可能是使用的 Lua 5.1。 这是文件头,以及一些(136 位,在可辨识代码的第一部分截断):

1B4C 7561 5101 0404 0406 0809 0908 B609
9368 E7F5 7D41 0800 0000 3D28 6E6F 6E65
2900 0000 0000 0100 0000 0000 0002 0000
0000 0000 0000 0000 0000 0700 0000 0410
0000 0044

这是文件的链接(它在我的学生 Gmail 帐户上托管):pgdebug.lua

点赞
用户7509065
用户7509065

Petrolution Mod-Tools称:

此格式用于Empire at War和Forces of Corruption游戏中。

每个Petroglyph Lua对象文件基本上是一个普通的Lua 5.0对象文件,除了三个区别:

  • Lua 5.0对象文件的签名为“\ \033Lua”。对于Petroglyph的Lua对象文件,这是“\ \033Lup”。
  • 表示文件版本的字节为Lua 5.0对象文件的0x50。Petroglyph的Lua对象文件使用0x51(实际上是5.0文件)。
  • 在每个函数头中,Petroglyph的Lua对象文件在“lineDefined”整数的右侧有一个额外的整数,可以忽略。

第一个函数的附加整数似乎从1开始,然后对于每个其他函数,不考虑函数嵌套,它增加1。据说此整数用于允许在保存游戏期间持续使用Lua状态。

看起来,unluac,虽然主要针对Lua 5.1,但也大部分适用于Lua 5.0。您将不得不对其进行轻微修改,以考虑这三个差异,或在运行unluac之前编辑文件以撤消这些更改。

此外,Petrolution还拥有一些工具看起来至少可以完成您正在尝试完成的一些任务。

2020-05-15 21:21:10
用户1847592
用户1847592

这段字节码几乎与 Lua 5.0 相同。

function DebugEventAlert(event, parameters)
   message = tostring(Script)..": handled event "..tostring(event)
   function AppendParameter(idx, val)
      message = message.."\nParameter "..tostring(idx)..": "..tostring(val)
   end
   table.foreachi(parameters, AppendParameter)
   MessageBox(message)
end

function MessageBox(t)
   _MessagePopup(string.format(unpack(t)))
end

function ScriptMessage(t)
   _ScriptMessage(string.format(unpack(t)))
end

function DebugMessage(t)
   _ScriptMessage(string.format(unpack(t)))
end

function OutputDebug(t)
   _OuputDebug(string.format(unpack(t)))
end

function ScriptError(t)
   outstr = string.format(unpack(t))
   _OuputDebug(outstr.."\n")
   _ScriptMessage(outstr)
   outstr = DumpCallStack()
   _OuputDebug(outstr.."\n")
   _ScriptMessage(outstr)
   ScriptExit()
end

function DebugPrintTable(t)
   DebugMessage("%s -- unit table contents:", tostring(Script))
   for unit in pairs(t) do
      DebugMessage("%s -- \t\t** unit:%s", tostring(Script), tostring(unit))
   end
end
2020-05-15 21:23:59