是否可以对这串混淆后的 Lua 代码进行反混淆?
Is it possible to deobfuscate this string of obfuscated Lua Code?
我有一个(另一个)字符串的 lua 代码被混淆了。我想知道是否有可能对其进行反混淆,或者弄清楚它是如何被混淆的,因为我以前从未遇到过类似的事情。这串代码被认为是恶意服务器端脚本执行程序的主要模块。了解里面的内容将有助于我们修补平台上的漏洞。有人告诉我,通过获取常量很容易破译,因为它是基于 VM 的混淆,我们只需要一点帮助来指出正确的方向。
代码比较大,所以在这个pastebin中。
pastebin com/dtfzBPZk
对这个进行去混淆处理似乎是一个稍微更手动的过程。像往常一样,您应该做的第一件事是重命名变量以具有更合理的名称,并在代码中添加空格和缩进。您可以在 https://pastebin.com/eRTGAbTH 看到它的开始。一旦你这样做了,你会看到这样的函数模式:
(function(...)
local SynapseXen_116 = "hi xen doesn't work on sk8r please help"
local SynapseXen_092 = SynapseXen_100(38909278, 3932326132)
local SynapseXen_069 = {...}
for SynapseXen_109, SynapseXen_043 in pairs(
SynapseXen_069
) do
local SynapseXen_119
local SynapseXen_097 = type(SynapseXen_043)
if SynapseXen_097 == "number" then
SynapseXen_119 = SynapseXen_043
elseif SynapseXen_097 == "string" then
SynapseXen_119 = SynapseXen_043:len()
elseif SynapseXen_097 == "table" then
SynapseXen_119 = SynapseXen_100(4264903821, 30110892)
end
SynapseXen_092 = SynapseXen_092 + SynapseXen_119
end
SynapseXen_140[1171393165] =
SynapseXen_bit_bxor(
SynapseXen_bit_bxor(2179831066, SynapseXen_092),
SynapseXen_bit_bxor(2132161653, SynapseXen_082)
) -
string.len(SynapseXen_116) -
SynapseXen_139 -
#{
2716917292,
2960928816,
2092744992,
3945961999,
2156388474,
2523828292,
534526172
}
return SynapseXen_140[1171393165]
end)({}, {}, 14275, 107, "iIIllIIlIIilillilI", "i", 5327, 3211, 14382, 14643)
现在你可以开始消除红鲱鱼了。例如,任何时候你看到 #{ a bunch of stuff in here }
,你可以只计算列表中的元素,并用计数替换整个元素。在这种情况下,我们可以用数字 7 替换接近末尾的其中一个。接下来,查看 SynapseXen_116
。它唯一使用的地方是它的长度,所以你也可以用它来代替。现在,在那之后,请注意这是在声明一个函数然后立即调用它,因此您可以替换它的参数。继续沿着这条路走下去,直到你发现 Lua-in-Lua VM 的核心,从那里,应该很容易在最后插入 Base64,并查看它解码的字节码到.
我有一个(另一个)字符串的 lua 代码被混淆了。我想知道是否有可能对其进行反混淆,或者弄清楚它是如何被混淆的,因为我以前从未遇到过类似的事情。这串代码被认为是恶意服务器端脚本执行程序的主要模块。了解里面的内容将有助于我们修补平台上的漏洞。有人告诉我,通过获取常量很容易破译,因为它是基于 VM 的混淆,我们只需要一点帮助来指出正确的方向。
代码比较大,所以在这个pastebin中。
pastebin com/dtfzBPZk
对这个进行去混淆处理似乎是一个稍微更手动的过程。像往常一样,您应该做的第一件事是重命名变量以具有更合理的名称,并在代码中添加空格和缩进。您可以在 https://pastebin.com/eRTGAbTH 看到它的开始。一旦你这样做了,你会看到这样的函数模式:
(function(...)
local SynapseXen_116 = "hi xen doesn't work on sk8r please help"
local SynapseXen_092 = SynapseXen_100(38909278, 3932326132)
local SynapseXen_069 = {...}
for SynapseXen_109, SynapseXen_043 in pairs(
SynapseXen_069
) do
local SynapseXen_119
local SynapseXen_097 = type(SynapseXen_043)
if SynapseXen_097 == "number" then
SynapseXen_119 = SynapseXen_043
elseif SynapseXen_097 == "string" then
SynapseXen_119 = SynapseXen_043:len()
elseif SynapseXen_097 == "table" then
SynapseXen_119 = SynapseXen_100(4264903821, 30110892)
end
SynapseXen_092 = SynapseXen_092 + SynapseXen_119
end
SynapseXen_140[1171393165] =
SynapseXen_bit_bxor(
SynapseXen_bit_bxor(2179831066, SynapseXen_092),
SynapseXen_bit_bxor(2132161653, SynapseXen_082)
) -
string.len(SynapseXen_116) -
SynapseXen_139 -
#{
2716917292,
2960928816,
2092744992,
3945961999,
2156388474,
2523828292,
534526172
}
return SynapseXen_140[1171393165]
end)({}, {}, 14275, 107, "iIIllIIlIIilillilI", "i", 5327, 3211, 14382, 14643)
现在你可以开始消除红鲱鱼了。例如,任何时候你看到 #{ a bunch of stuff in here }
,你可以只计算列表中的元素,并用计数替换整个元素。在这种情况下,我们可以用数字 7 替换接近末尾的其中一个。接下来,查看 SynapseXen_116
。它唯一使用的地方是它的长度,所以你也可以用它来代替。现在,在那之后,请注意这是在声明一个函数然后立即调用它,因此您可以替换它的参数。继续沿着这条路走下去,直到你发现 Lua-in-Lua VM 的核心,从那里,应该很容易在最后插入 Base64,并查看它解码的字节码到.