我需要任何能够解码“Luraph Obfuscator”的人[关闭]

Posted

技术标签:

【中文标题】我需要任何能够解码“Luraph Obfuscator”的人[关闭]【英文标题】:I need anyone that can, decode "Luraph Obfuscator" [closed] 【发布时间】:2020-03-26 00:57:57 【问题描述】:

我向一个不受信任的开发人员支付了一个脚本的费用。我以为他骗了我。他确实给我发了代码,但他混淆了脚本。这是一款使用 Lua 的名为“Roblox”的游戏,代码如下。据我运行它可以看出,它可能会起作用。但我需要更改脚本才能使其正常工作。有谁知道解码混淆?

https://pastebin.com/B8SZmZGE

local ilIillllII1i1lliliI = assert local II1ll1iliIIIIillIli = select local lIlillIlIi11I1lIIi11I = tonumber local i1li1IIIII1IIilIil1 = unpack local iIl1IIlI11i1il1ilII = pcall local lIlI1IiiIlIl1i11ll1Il = setfenv local iIIlilIlllIliiIili1 = setmetatable local ii1Iiill11ii1IIIill = type local lIll1I1ll1lliilII1Il1 = getfenv local IiIi1llliiIIllllI1i = tostring local Ii1IIill1ilI1lilIiI = error local iilli1lIi11lllIli1l = string.sub local lIlI1li1ll1lliliIlI = string.byte local lIli1Ill1liIlilIIIiiI = string.char local I1ii1iIIl1lI1Iii1iI = string.rep local iiiIiI11IIllIiliI1I = string.gsub local illlIIIllliill1l1ll = string.match local iIi1l1liili1I11l1II = 1 local function lIll1iillI1ll1iiIiIll(IIiiiIiiIllIl1i1i1I, iIililIlliIII11illi) local i1iiI1I1iII1iiIiil1 IIiiiIiiIllIl1i1i1I = iiiIiI11IIllIiliI1I(iilli1lIi11lllIli1l(IIiiiIiiIllIl1i1i1I, 5), "..", function(llii1Ii11lI1llilill) if lIlI1li1ll1lliliIlI(llii1Ii11lI1llilill, 2) == 71 then i1iiI1I1iII1iiIiil1 = lIlillIlIi11I1lIIi11I(iilli1lIi11lllIli1l(llii1Ii11lI1llilill, 1, 1)) return

【问题讨论】:

deobfuscated @EgorSkriptunoff 您是否碰巧拥有 Luraph 的自定义字节码或 Luraph 反混淆器? @Taazar - 我没有反混淆器。但是 Luraph 手动去混淆并不是很难。它的自定义字节码每次都不一样,所以你应该查看VM代码,而不仅仅是字节码。 @EgorSkriptunoff 我会在周末研究它,应该是一个很好的研究项目。你有什么推荐我开始的地方吗? @Taazar - 从查看this 项目开始。 Luraph 只是 lbi 的修改版本。 【参考方案1】:

好的,所以我是 turtsis,我看到人们一直在窃取我的答案并将其发布在 v3rmillion 上。所以我会发布另一个答案,但这次是关于如何实际获取它的内容的更好的答案。因此,基本上,如果您没有阅读我的其他答案,请不要阅读此答案:

Luraph 是一个自定义的 lbi,它是一个 lua 字节码解释器。如果你做 string.dump(function) 你会得到 luaQ 作为输出。这就是为什么人们使用 unluaC 或 luadec 来获取这些转储的来源。这称为字节码,它与 string:byte() 不同,因为它在 lua 5.1 及更高版本中是不可读的 lua 格式。为了能够使用这些编码的字符串/函数,您需要一个 lbi。 lbi 所做的是解释这些位并反序列化它们。下面是一个常用lbi的例子https://github.com/JustAPerson/lbi/blob/master/src/lbi.lua

好的,现在到您获取它的内容的部分。

在 lua(和其他编码语言)中有一种叫做操作码的东西。操作码控制 lua 的基础,其中有很多。以下是一些最常见和最有用的:

LOADK - 加载一个常量到寄存器 LOADBOOL - 加载一个布尔值到寄存器 LOADNIL - 将 nil 加载到寄存器中 JMP——跳跃 ADD - 向寄存器添加新事物 SUB - 从寄存器中减去一些东西

还有很多,但这些是我们将重点关注的主要内容。

好的,要正常获取这些,您需要一个名为 unluac 或 luadec 的外部程序,但为此我们将在基本 lua 中进行。我建议使用 repl.it 来运行代码。

所以我们需要的主要是 LOADK,因为它会加载一个常量

常量是一个变量或任何真正不会改变的东西例如:local value = 1

现在不是恒定的东西是变化的。

现在你可能听说过 Iron brew 和 synapse xen 两者都是由 3ds 和 Defcon42 创建的非常知名的 lua 混淆器

Iron brew 和 xen 有一些共同点(以及基础),它们不是 lbis,因此您通常不会从它们那里获得操作码。但是他们有一个包含所有常量的表(xen 是加密的)来获取这些表有一个完整的过程 table.concat 和 global 但这不是 luraph 而是其他混淆器。 Luraph 是不同的,因为它是一个 lbi,所以不需要一个包含所有常量的表。为了获取常量,我们需要一种从脚本中获取指令的方法。操作码是指令。它们是指令,因为操作码告诉 lua 如何处理代码。好的,那么我们如何获得这些说明?

这是一篇关于操作码和指令的文章: http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

所以他们都有签名: “sBx” “一种” “A”、“B” “A”、“Bx” “A”、“C” “A”、“sBx” “A”、“B”、“C” 您可以从这些说明中获得操作码 args。 现在不同的混淆器有不同的操作码指令,所以对于 luraph,你必须找到它们。好的,所以使用反汇编器或自己制作,但这是我朋友制作的反汇编器: https://github.com/op0x59/reddisassembler

您需要进入 repl.it 并创建一个 repo,然后添加代码并使用设置对其进行格式化等。在设置中有操作码的地方,您需要从 luraph 手动获取这些操作码。

所以你去吧,这就是你可以做到的。如果您需要更多关于不和谐的帮助,请联系我: 乌龟#6969 要么 turtsis#2785

还有谁在此处窃取我的答案并将其发布在 V3RMILLION 上而不给我信用,请停止或给我信用。

【讨论】:

【参考方案2】:

基本上它使用字节码 (\144\22\99\88),但它有一个自定义解释器和一个自定义字节码 vm,使其具有如下字节码: LPH|3EE5491D2B1A00192574A22B510A02002GE5E7E9E42GE5F53GE5F53GE5CD3GE5FDE42GE5C13GE5F934B71

因此,您需要将变量和函数重命名为 variable1variable2 之类的名称,以便您能够阅读。然后找到像

这样的垃圾代码部分
function 1iiii1i1i(i1i1ijj1jijij)
local 1j1j1jj1j1jijijij = (((10*2)/2)-3/9)
end
1iiii1i1i(90, 0)

这是完全没用的,旨在欺骗反编译器循环随机数函数。检查是否有类似的东西:iIi1l1liili1I11l1II = iIi1l1liili1I11l1II + 4 return Ii1IiI1I111I1II1IIi * 16777216 + iIII1iIiI1l1IlIIlii * 65536 + IIill111lli111ll1li * 256

这些是垃圾代码,只需在其余代码中查找它(使用ctrl+F)并查看它是否有用。如果是,则检查该用途是否有用途,依此类推,直到找到它是否是 vm 的一部分。问题是它可能会多次加载另一个加载字符串,直到反编译需要很长时间。因此,如果您真的需要消息来源,请通过 discord 联系我,我可以联系您 (turtsis#2785) 或花几个小时完成此操作

使用 Lua 美化器可以使其更易于理解。

如:[http://blackmiaool.com/lua-beautify/][1](https://github.com/blackmiaool/lua-beautify)

【讨论】:

【参考方案3】:

这个问题已经 5 个月大了,但无论如何你都可以去:

local L3_0, L4_1, L5_2, L6_3, L7_4
L3_0 = "rebel alience"
L4_1 = "Wasp"
L5_2 = "Bottom Small Mining Laser"
L6_3 = "Adamantite Ore"
for _FORV_7_ = 1, 10 do
workspace.Ships[L3_0][L4_1][L5_2].RemoteFireCommand:InvokeServer(CFrame.new(0, 0, 0,0.996030748, -7.7674794E-4, 0.0890064985, 0, 0.999961913, 0.00872653536, -0.0890098885,-0.00869189762, 0.995992839), workspace.Asteroids[L6_3],workspace.Asteroids[L6_3], workspace.Asteroids[L6_3].CenterPoint)
wait(3)
end

这是一个简单的远程事件。

您可以在此处找到使用的工具,它是开源的: https://github.com/TheGreatSageEqualToHeaven/LuraphDeobfuscator

【讨论】:

【参考方案4】:

脚本是

local L0, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22
L0 = "rebel alience"
L1 = "Wasp"
L2 = "Bottom Small Mining Laser"
L3 = "Adamantite Ore"
for L7 = L4, L5, L6 do
  L8 = Workspace
  L8 = L8.Ships
  L8 = L8[L0]
  L8 = L8[L1]
  L8 = L8[L2]
  L8 = L8.RemoteFireCommand
  L9 = L8
  L8 = L8.InvokeServer
  L10 = CFrame
  L10 = L10.new
  L11 = 0
  L12 = 0
  L13 = 0
  L14 = 0.996030748
  L15 = -7.7674794E-4
  L16 = 0.0890064985
  L17 = 0
  L18 = 0.999961913
  L19 = 0.00872653536
  L20 = -0.0890098885
  L21 = -0.00869189762
  L22 = 0.995992839
  L10 = L10(L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22)
  L11 = Workspace
  L11 = L11.Asteroids
  L11 = L11[L3]
  L12 = Workspace
  L12 = L12.Asteroids
  L12 = L12[L3]
  L13 = Workspace
  L13 = L13.Asteroids
  L13 = L13[L3]
  L13 = L13.CenterPoint
  L8(L9, L10, L11, L12, L13)
  L8 = wait
  L9 = 3
  L8(L9)
end

这些变量不是普通变量,因为我使用的是自动反混淆器,所以它可能看起来有点混乱

【讨论】:

说我想得到这个自动反混淆器,我应该给谁发消息?【参考方案5】:

我可能会迟到,但是

    反叛异化 黄蜂 底部小型采矿激光器 精金矿 1 10 工作区 船舶 远程消防命令 调用服务器 CFrame 新 0 0.996030748 -0.00077674794 0.0890064985 0.999961913 0.00872653536 -0.0890098885 -0.00869189762 0.995992839 小行星 中心点 等一下 3 1337

【讨论】:

【参考方案6】:

我有一个 luraph 转储程序,该脚本的转储版本仅显示一个变量“1337”我希望这会有所帮助!

【讨论】:

请添加更多/相关细节。你的回答完全没有意义。【参考方案7】:

最简单的事情之一是创建一个脚本来销毁所有 Luraph 的脚本。删除那些垃圾代码仍然是一个更好的选择,但这会在一段时间内发挥作用。

它的作用是,它基本上永远地破坏了这些脚本。最有趣的事情之一是它甚至不必永远摧毁它们。 Luraph 脚本的数量有限,它们可以乘以多少次才能使 Luraph 的脚本崩溃。

local condition = true
local Oofer = workspace.Camera 
while condition do 
    workspace.Camera:ClearAl1Children () 
    wait (2)
end

【讨论】:

请以非图片格式的文本上传您的代码。

以上是关于我需要任何能够解码“Luraph Obfuscator”的人[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android位图解码A

在 Clojure/Java 中解码 JWT

如何正确检测、解码和播放无线电流?

url解码和发布数据后出错

如何使用 c#.net 解码 amr 文件

你如何在 Tensorflow 中解码 one-hot 标签?