Hallo und herzlich wilkommen zu meinem Tutorial bezüglich des deobfuscaten von AutoIt Scripts.
Viele Obfuscatoren die versuchen den Code möglichst unleserlich zu machen halten nicht wirklich was sie versprechen. Damit ihr mir dies auch glauben tut werde ich in meinem Tutorial mal auf einen der auf Elitepvp bekanntesten Obfuscatoren eingehen.
Dieser Obfuscator ist sehr interessant doch lässt sich relativ simpel entschlüsseln. Angenommen unser Script sieht so aus:
Execute(BinaryToString("0x5F"&Stringlen("FXPN")&"9"&Stringlen("RMH")&"0"&Stringlen("LCCREYO")&(9+3)^2-136&Stringlen("RMH")&"5"&Stringlen("RMH")&"4433934454"&Stringlen("kB")&"353"&Stringlen("LCCREYO")&"4334334"&Stringlen("y")&"3"&Stringlen("kB")&"4541353"&(9+3)^2-136&"353935444"&Stringlen("kB")&"323"&(9+3)^2-136&"3435344230443"&Stringlen("LCCREYO")&"492829"))
Execute(BinaryToString("0x5F"&Stringlen("KUWM")&"949"&Stringlen("GOZ")&"0"&Stringlen("IJPHWSS")&"8"&Stringlen("GOZ")&"8433445363"&Stringlen("IJPHWSS")&"36453"&Stringlen("r")&"383"&Stringlen("IJPHWSS")&"3"&Execute(Binarytostring('0x696E7428436F732853696E202834373539312E3632363633313333303229295E2D3129'))&"3037344"&Stringlen("uZ")&"4345363630383736303"&Execute(Binarytostring('0x696E7428436F732853696E202834373539312E3632363633313333303229295E2D3129'))&"4"&Execute(Binarytostring('0x696E7428436F732853696E202834373539312E3632363633313333303229295E2D3129'))&"444644454"&Execute(Binarytostring('0x696E7428436F732853696E202834373539312E3632363633313333303229295E2D3129'))&Stringlen("uZ")&"829"))
Execute(BinaryToString("0x"&Stringlen("QNYY")&"D"&Stringlen("YWMGKCE")&Stringlen("KHZ")&"6"&Stringlen("YWMGKCE")&Stringlen("QNYY")&Stringlen("rS")&"6F"&Stringlen("YWMGKCE")&"8"&Stringlen("rS")&"8"&Stringlen("KHZ")&"0"&Stringlen("rS")&"C202"&Stringlen("QNYY")&Execute("_I0x44D2DA01DA4C3A52FAAB3F798DAE582A(9*9)-5")&"95F"&Execute("_I0x44D2DA01DA4C3A52FAAB3F798DAE582A(9*9)-5")&"9"&Stringlen("KHZ")&"0"&Stringlen("YWMGKCE")&"836323"&Stringlen("r")&"3"&Stringlen("YWMGKCE")&"33373"&Stringlen("r")&"32313441384635344337323543424635394530433234423932202C2024495F49307831464533343843373438394438413236313245363238444341313145384242342029"))
Func _I0x44D2DA01DA4C3A52FAAB3F798DAE582A($_I0xD977716DE62A3DE713C6813250E2E614)
local $_I0xA67B43EB2D400BD80D9D9A432D213FD8=StringSplit($_I0xD977716DE62A3DE713C6813250E2E614,"")
$_I0xD977716DE62A3DE713C6813250E2E614=Execute(BinaryToString("0x"&Stringlen("RAQJ")&"5"&Stringlen("JCPZRHE")&"8656"&Stringlen("RAS")&Stringlen("JCPZRHE")&"5"&Stringlen("JCPZRHE")&"465"&Stringlen("vF")&"8"&Stringlen("vF")&Stringlen("JCPZRHE")&"42696E6"&Stringlen("j")&Stringlen("JCPZRHE")&"279546F5"&Stringlen("RAS")&"7472696E672822"&Stringlen("RAS")&"0782226537472696E676C656E28224"&Stringlen("j")&"544A222926223022292729"))
For $_I0x6CB0903AE5A537FE12F6E0FC3DACC3E7=1 To UBound($_I0xA67B43EB2D400BD80D9D9A432D213FD8)-1
$_I0xD977716DE62A3DE713C6813250E2E614=Execute(BinaryToString("0x"&Stringlen("aD")&Stringlen("UWOG")&"5F49"&Stringlen("CAZ")&"0"&Stringlen("IFRRBIG")&Execute(Binarytostring('0x426974584F5228372C313529'))&"44"&Stringlen("CAZ")&"93737373"&Stringlen("l")&"364445363"&Stringlen("aD")&"4133444537313343363"&Execute(Binarytostring('0x426974584F5228372C313529'))&"31333"&Stringlen("aD")&"3530453"&Stringlen("aD")&"453631342B245F49307"&Execute(Binarytostring('0x426974584F5228372C313529'))&"4136374234334542324434303042443"&Execute(Binarytostring('0x426974584F5228372C313529'))&"3044394439413433324432313346443"&Execute(Binarytostring('0x426974584F5228372C313529'))&"5B245F49307836434230393033414535413533374645313246364530464333444143433345375D"))
Next
return $_I0xD977716DE62A3DE713C6813250E2E614
EndFunc
Func _II0x8C4E676E1871074BCE66087601ADFDEA()
Global $I_I0x6217371214A8F54C725CBF59E0C24B92
Execute(BinaryToString("0x"&Stringlen("SPQS")&Stringlen("v")&Stringlen("UOBQXIH")&Stringlen("CAQ")&Stringlen("UOBQXIH")&"369676E"&Stringlen("cC")&(5+1)^2-28&Stringlen("cC")&"7"&Stringlen("SPQS")&"95F49307"&(5+1)^2-28&"363"&Stringlen("cC")&"3"&Stringlen("v")&"373337313"&Stringlen("cC")&"313441384635344337323543424635394530433234423932272C2027546573742729"))
Global $I_I0x1FE348C7489D8A2612E628DCA11E8BB4
Execute(BinaryToString("0x"&Stringlen("QBKE")&Stringlen("r")&Stringlen("AQOGXZU")&Stringlen("RPW")&Stringlen("AQOGXZU")&"3696"&Stringlen("AQOGXZU")&"6E"&Stringlen("tT")&"8"&Stringlen("tT")&"7"&Stringlen("QBKE")&"95F4930783"&Stringlen("r")&"4645333438433734383944384"&Stringlen("r")&"3"&Stringlen("tT")&"363"&Execute(Binarytostring('0x696E7428436F732853696E202833393736342E3431363733353732393429295E2D3129'))&"324536323844434"&Execute(Binarytostring('0x696E7428436F732853696E202833393736342E3431363733353732393429295E2D3129'))&"3"&Execute(Binarytostring('0x696E7428436F732853696E202833393736342E3431363733353732393429295E2D3129'))&"3"&Execute(Binarytostring('0x696E7428436F732853696E202833393736342E3431363733353732393429295E2D3129'))&"4538424234272C202745696E2065696E666"&Execute(Binarytostring('0x696E7428436F732853696E202833393736342E3431363733353732393429295E2D3129'))&"6368657220546573742729"))
EndFunc
Func _I0x54C94EB57C43A2EA58595DB28454B0D7I()
Endfunc
Viele würden jetzt hier verzweifeln da es einfach zu kompliziert aussieht. Doch eigentlich ist das ganz einfach. Jeder Befehl fängt mit einem Execute an, dahinter ist ein BinaryToString mit variierenden Sachen. Wie könnten wir das ganz einfach nun deobfuscaten? Nunja, was obfuscatet ist muss auch deobfuscatet werden damit es der Compiler versteht. Der eigentlich Code befindet sich hinter dem Execute, der Execute Befehl ist nur dazu da um den Code, der in dieser Zeile entschlüsselt wird auszuführen. Also brauchen wir nur das Execute weglassen und danach und ausgeben lassen was encryptet werden würde. Das lässt sich ganz einfach so ausgeben:
Code:
$Command =
MsgBox(0, "Ausgabe", $Command)
In die Variable setzt ihr dann einfach den BinaryToString rein. So packt ihr es dann Zeile für rein, ihr seht es sind auch noch Funktionen da, deobfuscatet sie auch. Wenn alles fertig ist sollte es so aussehen:
_I0x54C94EB57C43A2EA58595DB28454B0D7I()
_II0x8C4E676E1871074BCE66087601ADFDEA()
MsgBox(0, $I_I0x6217371214A8F54C725CBF59E0C24B92 , $I_I0x1FE348C7489D8A2612E628DCA11E8BB4 )
Func _I0x44D2DA01DA4C3A52FAAB3F798DAE582A($_I0xD977716DE62A3DE713C6813250E2E614)
Local $_I0xA67B43EB2D400BD80D9D9A432D213FD8 = StringSplit($_I0xD977716DE62A3DE713C6813250E2E614,"")
$_I0xD977716DE62A3DE713C6813250E2E614 = 0
For $_I0x6CB0903AE5A537FE12F6E0FC3DACC3E7 = 1 To UBound($_I0xA67B43EB2D400BD80D9D9A432D213FD8) -1
$_I0xD977716DE62A3DE713C6813250E2E614 = $_I0xD977716DE62A3DE713C6813250E2E614 + $_I0xA67B43EB2D400BD80D9D9A432D213FD8[$_I0x6CB0903AE5A537FE12F6E0FC3DACC3E7]
Next
return $_I0xD977716DE62A3DE713C6813250E2E614
EndFunc
Func _II0x8C4E676E1871074BCE66087601ADFDEA()
Global $I_I0x6217371214A8F54C725CBF59E0C24B92
Assign('I_I0x6217371214A8F54C725CBF59E0C24B92', 'Test')
Global $I_I0x1FE348C7489D8A2612E628DCA11E8BB4
Assign('I_I0x1FE348C7489D8A2612E628DCA11E8BB4', 'Ein einfacher Test')
EndFunc
Func _I0x54C94EB57C43A2EA58595DB28454B0D7I()
Endfunc
Das war es nun auch schon zu meinem kleinen Tutorial. Dieses Prinzip lässt sich nebenbei bei allen Obfuscatoren anwenden in jeder Sprache, nur die Befehle untereinander variieren.
Hier ist auch noch ein besseres prinzip was euch die Arbeit erleichtern könnte:
Natürlich gibt es noch viele andere möglichkeiten doch diese ist die wesentlichste. Ihr könnt das ganze ja auch in einem Programm automatisieren wenn ihr wollt.
Hab mich schon vor einem Jahr damit beschäftigt und eine Art deobfuscator geschrieben. Trotzdem bleibt der Code doof / unbequem zu lesen, da die Variablen- und Funktionsnamen ja nicht wiederhergestellt werden können.
Trotzdem gute Arbeit
Dann frag ich mich was die damit anfangen wollen..
Code:
Func _II0x8C4E676E1871074BCE66087601ADFDEA()
Global $I_I0x6217371214A8F54C725CBF59E0C24B92
Assign('I_I0x6217371214A8F54C725CBF59E0C24B92', 'Test')
Global $I_I0x1FE348C7489D8A2612E628DCA11E8BB4
Assign('I_I0x1FE348C7489D8A2612E628DCA11E8BB4', 'Ein einfacher Test')
EndFunc
kann bestimmt jeder von denen flüssig lesen, nen tut wie man hashs knacken kann wär sinnvoller, auch wenns naja nicht wirklich möglich ist, zumindest bei shadow da er ja random krams nutzt...
now check the functions, which get executed and you'll see that "_I0x54C94EB57C43A2EA58595DB28454B0D7I()" doesn't do anything, so replace the executes in the following function by consolewrite again:
Mh.. Wie kann man so thanks geil sein.. Jeder der Ahnung davon hat, auch wenns nur ein bisschen ist, dürfte das alleine rausbekommen...
Und du bist?
Nein. Gehirn ist heutzutage knappe Ware.
Was hat das mit Thanksgeilheit zu tun? Bloß weil ich zu der Community etwas beitragen will bin ich Thanksgeil? Denk mal über deine Posts nach... Außerdem hab ich nirgendwo gesagt dass ich dafür Thanks möchte.
Quote:
Originally Posted by Miichiii
Dann frag ich mich was die damit anfangen wollen..
Code:
Func _II0x8C4E676E1871074BCE66087601ADFDEA()
Global $I_I0x6217371214A8F54C725CBF59E0C24B92
Assign('I_I0x6217371214A8F54C725CBF59E0C24B92', 'Test')
Global $I_I0x1FE348C7489D8A2612E628DCA11E8BB4
Assign('I_I0x1FE348C7489D8A2612E628DCA11E8BB4', 'Ein einfacher Test')
EndFunc
kann bestimmt jeder von denen flüssig lesen, nen tut wie man hashs knacken kann wär sinnvoller, auch wenns naja nicht wirklich möglich ist, zumindest bei shadow da er ja random krams nutzt...
Klar kann man das Flüssig lesen. Sieht anders ausgedrückt auch nur so aus:
Was hat das mit Thanksgeilheit zu tun? Bloß weil ich zu der Community etwas beitragen will bin ich Thanksgeil? Denk mal über deine Posts nach... Außerdem hab ich nirgendwo gesagt dass ich dafür Thanks möchte.
Klar kann man das Flüssig lesen. Sieht anders ausgedrückt auch nur so aus:
Das neue ist halt nur das mithilfe von Assign die Variablen Definiert werden.
Die meisten Hashes sind MD5. Da MD5 eine einseite Verschlüsselung ist kommst du nur durch Brutforcen an den Ursprunglichen Wert bzw. Name.
Wer ich bin ist egal?
Und wieso willst du denen helfen, bei denen "Gehirn knappe Ware" ist? Bzw, wieso denkst du dass es die interessieren wird? xD
Sie werden die Funktionen nicht flüssig lesen können, das kannst du, das kann ich, die könnens aber nicht, meiner Meinung nach, naja
Und "Thanksgeilheit", war meine eigene Meinung, verzeih mir ;D
[Ironie] Das die Hashs MD5 sind, ist mir jetzt auch wieder komplett neu
Genauso wie man an die "Entschlüsslung" kommt, brute force.. [/Ironie]
Deswegen wär nen Tut auch gut, falls jemand ne andere Möglichkeit kennt, zumindest im Falle Shadow.. ^^
Wer ich bin ist egal?
Und wieso willst du denen helfen, bei denen "Gehirn knappe Ware" ist? Bzw, wieso denkst du dass es die interessieren wird? xD
Sie werden die Funktionen nicht flüssig lesen können, das kannst du, das kann ich, die könnens aber nicht, meiner Meinung nach, naja
Und "Thanksgeilheit", war meine eigene Meinung, verzeih mir ;D
[Ironie] Das die Hashs MD5 sind, ist mir jetzt auch wieder komplett neu
Genauso wie man an die "Entschlüsslung" kommt, brute force.. [/Ironie]
Deswegen wär nen Tut auch gut, falls jemand ne andere Möglichkeit kennt, zumindest im Falle Shadow.. ^^
Naja. 0x47757465205265697365203A29
hashes sind nicht umkehrbar. es wird bewusst ein string von bestimmter länge erzeugt, welcher möglichst wenig mit dem original zu tun hat, welcher aber nach dem selben algorithmus immer wieder aus ein und dem selben string erstellt werden kann..
selbst mit bruteforce, kann man den ursprung nicht wieder herstellen, da es mehrere ergebnisse geben kann, welche zu ein und dem selben hash führen. genau darin besteht ja der sinn vom hashing. admins von websites, welche mit hashes arbeiten, können dem user so 100%ig garantieren, dass das passwort vom user niemals einsehbar sein kann, da nichteinmal der server selbst das passwort kennt.
für passwörter ist es natürlich ungünstig das mehrere strings zu ein und dem selben hash wert führen können, für variablennamen hingegen bedeutet das, das wir niemals mit 100%iger sicherheit das original wieder herstellen können, egal welchen weg wir einschlagen.
hashes sind nicht umkehrbar. es wird bewusst ein string von bestimmter länge erzeugt, welcher möglichst wenig mit dem original zu tun hat, welcher aber nach dem selben algorithmus immer wieder aus ein und dem selben string erstellt werden kann..
selbst mit bruteforce, kann man den ursprung nicht wieder herstellen, da es mehrere ergebnisse geben kann, welche zu ein und dem selben hash führen. genau darin besteht ja der sinn vom hashing. admins von websites, welche mit hashes arbeiten, können dem user so 100%ig garantieren, dass das passwort vom user niemals einsehbar sein kann, da nichteinmal der server selbst das passwort kennt.
für passwörter ist es natürlich ungünstig das mehrere strings zu ein und dem selben hash wert führen können, für variablennamen hingegen bedeutet das, das wir niemals mit 100%iger sicherheit das original wieder herstellen können, egal welchen weg wir einschlagen.
100% niemals Mit passender Hardware und Wordlist kann man innerhalb von Stunden eine Menge erreichen.
Programm deobfuscaten 04/19/2012 - General Coding - 2 Replies Hallo,
Ich möchte ein Programm welches mit Cryptos deobfuscatet wurde entpacken(Anwendung in C# geschrieben) und dann in meinem Visual Studio öffnen.
Weiß jemand wie es geht?