1

我最近下载了一些 lua 代码,我在里面发现了一些混淆的字符串。这让我想知道那里使用了什么样的混淆技术。有人有想法吗?

local code='\27\76\117\97\81\0\1\4\4\4\8\0\64\0\0\0\64\67\58\92\85\115\101\114\115\92\65\108\101\120\92\68\101\115\107\116\111\112'
loadstring(code)()

编辑:更多(加密?)代码。

'\196\2\28\66\0\1\198\193\194\2\25\128\129\3\22\64\14\128\197\193\0\0\198\193\ 195\3\6\2\196\2\220\129\0\1\218'

4

6 回答 6

4

棘手的部分是loadstring相关函数同时接受 lua 代码和 lua 字节代码。该调用loadstring只是传递字节编译的 lua 而不是 lua 源代码。

您可以轻松获得字节编译的 lua。你可以得到一个这样的例子

  • 创建一个 lua 文件。
  • 用luac编译生成lauc.out
  • 使用十六进制查看器查看文件内容。

对于一个空的 lua 文件,我得到:

0000000: 1b4c 7561 5100 0104 0804 0800 0900 0000  .LuaQ...........
0000010: 0000 0000 4066 6f6f 2e6c 7561 0000 0000  ....@foo.lua....
0000020: 0000 0000 0000 0002 0201 0000 001e 0080  ................
0000030: 0000 0000 0000 0000 0001 0000 0001 0000  ................
0000040: 0000 0000 0000 0000 00                   .........

前 8 个字节到十进制的转换是:

27, 76, 117, 97, 81, 0, 1, 4

与您的字符串中的转义字符匹配。

如果您想了解有关块中代码的更多详细信息,您需要将块写入文件并使用 lua 反编译工具进行调查。ChunkSpyluadec15unluac都在 lua wiki工具页面中提及。

您提供的块中没有足够的内容让我更进一步,我认为它被截断了?

于 2013-04-12T00:58:10.577 回答
3

看起来根本没有加密。似乎它只是一个字节序列。每个反斜杠代表一个带有字节码的字符。

27是escape,76是'L',117是'u',97是'a'等等。

通过一个简短的脚本运行它会给我这个字符串(符号是特殊字符,例如转义、标题开头和 null):←LuaQ ☺♦♦ @@C:\Users\Alex\Desktop

您可以在ascii 表中查找字节。

更新:一些研究告诉我 LuaQ 意味着它是一个预编译脚本或类似的东西。不过,我可能会走得很远。

于 2013-04-12T00:49:21.620 回答
0

与其试图给你一个简单的答案,我想告诉你一些事情,以了解你是否在此过程中遇到这样的事情。

这种混淆不是很安全,实际上来自 ASCII 表。通常,这些类型的混淆是在 Lua 5.1 中进行的,并且可以很容易地用 a:bytetable.concat. 您可以使用更强大的 Troy 解释版本来简单地反转此代码,该版本可以绕过它周围的大多数安全性:

function loadstring(input)
   print(input)
end

所以我希望你对这些东西的工作原理有所了解。如前所述,这可以通过使用:bytetable.concat使用来复制。

于 2018-07-08T13:14:28.477 回答
0

如果它有加载字符串,那么一种可能并不总是有效的简单方法就是添加

加载字符串 = 打印;

在开始时

于 2018-06-18T11:24:27.623 回答
0

它易于反混淆加密

local a ='\196\2\28\66\0\1\198\193\194\2\25\128\129\3\22\64\14\128\197\193\0\0\198\193\195\3\6\2\196\2\220\129\0\1\218'
print(a)
于 2020-07-19T15:28:23.157 回答
0

你可以这样做

旧代码:

loadstring(your string)

你可以通过使用 print() 而不是 loadstring() 来查看/去混淆它

新代码:

print(your string) 

新脚本:

local code='\27\76\117\97\81\0\1\4\4\4\8\0\64\0\0\0\64\67\58\92\85\115\101\114\115\92\65\108\101\120\92\68\101\115\107\116\111\112'

print(code)
于 2020-12-01T16:39:43.160 回答