如何重新编译的字节码编译为Lua的VM /编译器上市?

问题描述 投票:1回答:2

我试图修改被称为在大学我的软件工程课程独特的研究项目长跑2旧手机游戏的代码。

该应用程序是使用电晕SDK制成,因此在Lua编程。所以,一旦我上了APK我的手,解压缩它,我需要解压resource.car(电晕归档)来访问到Lua文件。所以,我没有,和所有档案里面的文件是预编译.lu文件。

我为了修改Lua代码尝试的第一件事就是用unluac / luadec到.lu文件反编译成可读,可修改,能够将要编译源代码。我能够成功反编译,修改和重新编译他们,但是当它得到实际执行修改后的.lu文件中的游戏,它坠毁的原因是与试图指数零值。我发现,这样做的原因是事实,有一种叫做的upvalue,当其调试信息从一个编译的Lua文件剥离,是不可能恢复,因此试图反编译和重新编译.lu文件不打算上班。

所以,我的下一个方法是使用luac -l方法,它创造了Lua的虚拟机的字节码编译的清单。

luac -l lua.gameLogic.powerUpChance.lu的结果是沿行

...
main <?:0,0> (11 instructions, 44 bytes at 025D7D80)
0+ params, 3 slots, 0 upvalues, 0 locals, 4 constants, 2 functions
    1   [-] NEWTABLE    0 0 0
    2   [-] GETGLOBAL   1 -1    ; require
    3   [-] LOADK       2 -2    ; "composer"
    4   [-] CALL        1 2 2
    5   [-] CLOSURE     2 0 ; 025D8280
    6   [-] MOVE        0 1
    7   [-] SETTABLE    0 -3 2  ; "selectRandomPowerUp" -
...

鉴于这一指令列表,我知道我需要什么样的修改,在哪里修改它,我这样做了。这让我想起我的问题 - 我该如何采取修改字节码列表和编译它放回编译.lu文件?这甚至可能吗?这方法在修改编译Lua的文件中浪费我的时间?

android lua compilation bytecode
2个回答
1
投票

有没有工具(无据我所知,至少)编译的字节代码的字符串表示回到正确的Lua字节码;主要是因为,这不是意味着要修改,但作为一种方法来检查你的Lua代码编译并可能对其进行优化。

一个更好的解决办法是使用一个工具,反编译的字节代码到Lua代码。使用哪个工具来为这个在很大程度上取决于你使用的是什么版本的Lua,但是从5.1到5.3孤单LuaDec,我还没有亲自试过什么,而是应该把工作做好。一旦你反编译源,进行所有必要的修改,并再次luac编译它,你会与任何Lua的文件来执行。

希望这可以帮助 :)


0
投票

看来你正在使用反编译器无法正确编译for循环。 下面的代码片段:

if A1_3 == #A3_5 and A2_4 > 2 then
   for _FORV_9_ = 1, #A3_5 do
   end
   if _FOR_ then
      L5_7 = 11
   end
end

一定是这样的:

if A1_3 == # A3_5 and A2_4 > 2 then
   local R6 = true
   for k = 1, #A3_5 do
      if not A3_5[k].mainPlayer then
         if A3_5[k].x < A0_2.x + 1200 then
            R6 = false
         end
      end
   end
   if R6 then
      L5_7 = 11
   end
end
© www.soinside.com 2019 - 2024. All rights reserved.