无法确定此文件的 Lua 格式

Cannot Determine the Lua Formatting of this File

目前,我正在尝试读取一个 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)

我折腾了几个小时,分配了一个功能字节码,看看编译时是否有错误。但是,无论我做什么,none 的反编译器都能正常工作。我使用过 unluac、chunkspy 和 luadec,所有这些都会导致字节码格式不佳 header。没有一个可以分解或分析。查看有问题的文件,我可以看到对于字节码文件,有相当多的填充 (0x00) 被替换为 0x20,我认为这是一个 ' '。您还会注意到该文件有 LuaQ,这是我做的,我忘了编辑它。原始版本是 LupQ,我认为这可能是一种安全措施,但不能 100% 确定我对此是正确的。

目前,我得出结论,可能是我错过了一些重要和基本的东西,任何信息都会有所帮助。我已经包含了一个 link,您可以将代码文件下载到其中。

此文件属于 Wars: Empire War,Petroglyph 于 2006 年推出的一款旧 PC 游戏,因此很可能任何编译都是使用 Lua 5.1 完成的 这是header,然后是一些(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

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

Petrolution Mod-Tools 是这样说的:

This format is used in the games Empire at War and Forces of Corruption.

Each Petroglyph Lua object file is basically a normal Lua 5.0 object file except for three differences:

  • The signature for Lua 5.0 object files is "3Lua". For Petroglyph's Lua object files this is "3Lup"
  • The byte that indicates the file version is 0x50 for the Lua 5.0 object files. Petroglyph's Lua object files use 0x51 (it really IS a 5.0 file though).
  • In each function header, Petroglyph's Lua object files have an additional integer right after the "lineDefined" integer that can be ignored.

The additional integer seems to start at 1 for the first function in the file, and then increases by one for every other function, disregarding function nesting. This integer is supposedly used to allow for persistent Lua state during save-games.

看起来像 unluac,虽然主要用于 Lua 5.1,但也主要适用于 Lua 5.0。您必须对其进行轻微修改以解决这三个差异,或者编辑文件以在 运行 unluac.

之前撤消这些更改

另外,Petrolution 也有 some tools 看起来他们至少可以做一些你想做的事情。

这是与 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