web-dev-qa-db-ja.com

「Luraph Obfuscator」をデコードできる人が必要です

信頼できない開発者にスクリプトを支払いました。そして私が思ったように、彼は私をだました。彼は私にコードを送信しましたが、スクリプトを難読化しました。 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
1
jonah robberts

わかりましたので、私はターチスです。人々が私の答えを盗んでv3rmillionに投稿しているようです。だから私は別の答えを投稿しますが、今回は実際にその内容を取得する方法についてのより良い答えです。したがって、基本的には、他の答えを読んでいない場合は、この答えを読まないでください。

Luraphは、Luaバイトコードインタープリターであるカスタムlbiです。 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です

定数とは、変数または実際には変化しないものです。例:ローカル値= 1

定数ではないものは、変化するものです。

今、おそらく鉄の醸造とシナプスXenの両方が3dsとDefcon42によって作成された非常に有名なlua難読化ツールであると聞いたことがあります。

Iron BrewとXenには共通のものがあります(ベースも同様)。これらはlbisではないため、通常、それらからオペコードを取得しません。ただし、これらのテーブルを取得するためにすべての定数(xenは暗号化されています)を含むテーブルがあります。table.concatとglobalを使用したプロセス全体がありますが、それは他の難読化ツールではありません。 Luraphは異なりますが、LBIなので、すべての定数を含むテーブルは必要ありません。代わりに、定数を取得するには、スクリプトから命令を取得する方法が必要です。オペコードは命令です。オペコードはluaにコードの処理方法を指示するため、これらは命令です。 Okでは、これらの指示をどのように取得しますか?

オペコードと手順に関する記事は次のとおりです。 http://luaforge.net/docman/83​​/98/ANoFrillsIntroToLua51VMInstructions.pdf

したがって、すべてに署名があります:「sBx」「A」「A」、「B」「A」、「Bx」「A」、「C」「A」、「sBx」「A」、「B」、「C ”これらの命令からopcodes argsを取得します。今やさまざまな難読化ツールにはさまざまなopcodes命令が含まれているため、luraphの場合はそれらを見つける必要があります。Ok逆アセンブラーを使用するか、独自のものを作成します: https://github.com/op0x59/reddisassembler

Repl.itに移動してリポジトリを作成し、コードを追加して設定などでフォーマットする必要があります。設定にオペコードがある場合、luraphからこれらを手動で取得する必要があります。

だから、あなたはそれをあなたがそれを行う方法です。不協和音でdm meのヘルプがさらに必要な場合:turtsis#6969またはturtsis#2785

また、誰もISここで私の答えを盗み、V3RMILLIONにクレジットを付けずに投稿します。クレジットを停止してくださいORクレジットを提供してください。

4
turtsis

基本的にはバイトコード(\ 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の一部であるかどうかを確認します。しかし、これは、これを逆コンパイルするのに非常に長い時間がかかるまで、別のロードストリングを何度もロードする可能性があるということです。ソースが本当に必要な場合は、不和について私に連絡してください(turtsis#2785)またはこれに数時間入れることができます

Lua美容師を使用すると、理解しやすくなります。

例:[http://blackmiaool.com/lua-beautify/][1]https://github.com/blackmiaool/lua-beautify

3
turtsis

スクリプトは

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

変数は通常の変数ではなく、自動解読器を使用していたため、少し混乱するかもしれません

0
AdamScottCow

この質問は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

0
Defalt