【发布时间】:2019-07-01 03:37:48
【问题描述】:
我正在尝试修改一款名为 Fun Run 2 的旧手机游戏的代码,作为我大学软件工程课程的一个独特研究项目。
该应用是使用 Corona SDK 制作的,因此使用 Lua 进行编程。因此,一旦我拿到 APK 并解压缩它,我需要解压缩 resource.car (Corona ARchive) 以访问 Lua 文件。所以我这样做了,并且该存档中的所有文件都是预编译的 .lu 文件。
为了修改 Lua 代码,我尝试的第一件事是使用 unluac/luadec 将 .lu 文件反编译为可读、可修改、可编译的源代码。我能够成功地对它们进行反编译、修改和重新编译,但是当它在游戏中实际执行修改后的 .lu 文件时,它因为尝试索引一个 nil 值而崩溃。我发现造成这种情况的原因是有一个叫做 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 文件的方法是在浪费我的时间吗?
【问题讨论】:
-
请上传您的字节码文件。
-
@EgorSkriptunoff 给你,这是未修改的版本 - pastebin.com/gZjFsKDL
-
我问的是字节码二进制文件,而不是它的列表。
-
@EgorSkriptunoff 我错了,你在这里 - ufile.io/hu26d
-
好的,通常是没有调试信息的 Lua 5.1 x86 字节码。这个文件应该被反编译和重新编译没有问题。所有的上值都在里面描述(除了它们的名字),不需要额外的信息。显示反编译结果(检查反编译是否正确)。
标签: android lua compilation bytecode