如何去混淆 Lua 脚本?

问题描述

我怀疑有些 Lua 代码被混淆了。我该如何去混淆它?

我认为代码被混淆了,因为它看起来与普通的 Lua 代码非常不同,但我知道它是有效的 Lua 代码,因为 Lua 解释器仍然会编译和运行代码。

我有合法的兴趣去混淆代码,并且不打算违背作者的意愿分发它或修改它以规避任何 DRM 机制。

解决方法

混淆Lua源代码一般有两种方式:

  1. 直接混淆代码,主要是通过重命名变量、引入牵引和重组代码以使其更难遵循

  2. 对源代码进行编码并将其作为字符串嵌入到 Lua 文件中,该文件仅解码、加载和运行编码的 real 程序。

实际上,经常使用两者的组合:程序被混淆,然后编码并包装在一个字符串中。最后,加载和运行字符串的代码经常被再次混淆。


用于使 Lua 代码更难遵循的典型机制包括:

  1. 重命名string.gsubtable.concat等标准函数
  2. 将变量重命名为无意义
  3. 用括号表示法替换表索引的点和冒号表示法
  4. 对文字字符串使用十六进制表示法(通常与 3 结合使用。)

一般来说,手动去混淆这些代码的步骤通常非常相似:重新格式化代码以使其更容易遵循控制流,然后弄清楚每个变量代表什么并重命名它们。为此,通常需要对语言有很好的理解,因为人们需要了解混淆所利用的所有规则,使代码更难理解。需要注意的一些此类规则:

  1. 局部变量遮蔽:两个不同的变量在不同的范围内(甚至在同一范围内)可以有相同的名称。
  2. 句法糖,例如点符号和冒号符号
  3. 函数环境和 getfenvsetfenv
  4. 元表,所有字符串共享一个元表,__index 设置为 string
  5. 空格在 Lua 中通常是无关紧要的,在某些情况下只需要分隔语句,这也可以使用 ; 来完成。

有关去混淆特定 Lua 代码片段的详细帮助,您可以在以下其他在线社区中询问:

但请记住:Don't ask to ask,just ask

请注意,这些不是官方社区。如需更多选项,请参阅 Lua 官方网站上的 Community 页面。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...