是否可以更改Lua字节码内的值?怎么样?任何的想法?

时间:2013-10-08 08:22:10

标签: lua bytecode decompiler recompile

我得到了一个不再受支持的脚本,我正在寻找一种方法来更改其中变量的值...脚本已加密(loadstring/bytecode/类似的东西)例如:{{ 1}}

我可以找到我想要更改的内容(在编译脚本后通过记事本),但如果我尝试更改值,脚本将无法正常工作,如果我更改并尝试重新编译它仍然无法正常工作:loadstring('\27\76\117\97\81\0\1\4\4\4\8\0\')

有什么想法吗?我使用 ollydbg 做了类似的程序,但我不能将它用于 lua 脚本......我有点迷失在这里,做一些谷歌搜索很长一段时间都找不到方法......有什么想法吗?

1 个答案:

答案 0 :(得分:7)

在Lua字节码中更改字符串很容易。您只需在更改后调整字符串的长度即可。长度在字符串之前。它可能需要在字符串之前的四个或八个字节,具体取决于您是否具有32位或64位平台。长度存储在生成字节码的机器的字节序中。请注意,字符串包含尾部'\ 0',这将计入长度。

也许直接复制一些字节更容易。写这个文件

return "this is the new string you want" 

使用luac从中生成字节码并查看luac.out转储并找到字符串及其长度。将这些字节复制到原始文件。

我不知道记事本是否处理二进制数据。如果没有,你需要一个十六进制编辑器才能做到这一点。

另一个解决方案是编写一个Lua程序,它将字节码作为字符串读取,为return "this is the new string you want"生成字节码,使用字符串操作执行原始字节码的更改并将其写回文件。

您还可以尝试我的字节码检查器库lbci,它允许您更改函数中的常量。您将加载字节码(但不执行它),并在找到包含您想要更改的字符串的常量后使用setconstant

总之,这里有一些乐趣......