如何去混淆 Lua 脚本?

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

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

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

点赞
用户4984564
用户4984564

通常有两种方法来混淆 Lua 源代码:

  1. 直接混淆代码,主要是通过重命名变量,引入干扰和重构代码使其更难跟踪
  2. 编码源代码并将其嵌入字符串中,在仅解码、加载和运行编码的实际程序的 Lua 文件中

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


用于使 Lua 代码难以跟踪的典型机制包括:

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

一般来说,手动解混淆这样的代码的步骤通常非常相似:重新格式化代码以使其更容易跟踪控制流程,然后确定每个变量所代表的含义并将其重命名。要做到这一点,通常需要对语言有很好的理解,因为一个人需要了解混淆利用的所有规则,以使代码更难理解。一些需要注意的规则包括:

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

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

但请记住:**不要询问是否能够提问,直接提问**

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

2021-02-09 14:44:47