Easytools - Cracked and Leaked
Beginnen wir den Post doch mal mit einem Bild:
Mit diesem Crack hatte ich (in gewisser Weise) eine persönliche Bindung. Warum? Weil niemand ungestraft den Namen EasyTools, EasyCrypter und schon garnicht EasyBot verwendet!
Leider war in dem Crypter keine Stub enthalten, welche dann (wie immer) über den ICSharpCodeProvider erstellt wird.
Doch kommen wir zum Technischen: Der Crypter, sowie der Binder, wurden über CLISecure 5.X geschützt. CLISecure entschlüsselt den MSIL-Code, hooked die JIT und entschlüsselt zur Laufzeit. Im letzen Post lernten wir wie sinnlos JITHook sind, der wer zuerst hooked gewinnt!
Zuerst dumpte ich, in Ermangelung eines funktionieren JITDumper3 für .NET 4, mit dem Simple MSIL Dumper den Code. Ein paar wenige Funktionen wurden angezeigt, doch verfolgt CLISecure ein anderes Prinzip beim Schützen von Funktionen: Delegates!
Delegates sind im Grunde genommen Funktionszeiger. Über einen sog. Proxy spricht CLISecure die ganzen Funktionen nur über Delegates und dynamische Invokes an, im Endeffekt werden alle dort sichtbaren Delegates mit den richtigen Funktionen erst zur Laufzeit verknüft. Keine schlechte Idee
Mit diesem Dump kam ich nicht weiter. Gerade dieses Proxysystem verwirrte mich und irgendwann gab ich es auf. Oder auch nicht, denn im Hinterkopf hatte ich De4Dot! Was nicht über JITDumpen geht, das geht über De4Dot! Dieser statische “unpacker” zernimmt CLISecure in 3 Sekunden. De4Dot entschlüsselt dabei den MSIL-Code (wow), fixxt die Namen (uberwow), entschlüsselt die Strings (leetwow), macht aus allen Delegates echte Funktionen (AWESOME!) und erstellt eine Lauffähige Version (*Sound wie bei 0:30 mach*).
Der Rest war ein Kinderspiel: In der FormLoad wird die Lizenz eingelesen und die Debugger-Antis gestartet. Danach wird die Lizenz an einer MD5-Hash-Ultra-RSA-Whatever-Crypt übergeben, nochmal quergeprüft und schließlich ein Array mit 3 Strings zurückgeliefert. Danach wird die Bool-Variable “IsLicenced” auf true gesetzt. Die Orginale Funktion sieht so aus:
private void GForm1_Load(object sender, EventArgs e) { try { this.class3_0.method_0(); // Alle Antis gegen Debugger lolz string str = File.ReadAllText(Application.StartupPath + @"\License\crypter.license"); if (str.Length > 0) // Wenn das Lizenzfile Text enthält { string[] strArray = this.class3_0.method_1(str); // Lizenzprüfung this.kryptonLabel_14.Text = strArray[0] + " - " + strArray[1] + " - " + strArray[2]; // Lizenztext setzen this.bool_0 = true; // bIsLicenced = true } } catch { KryptonMessageBox.Show("Invalid license file!", "License Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } |
Die Antis sind dabei relativ kreativ gehalten, wenn auch nur zusammenkopiert. Aber es lohnt sich einen Blick reinzuwerfen, es wird neben IsDebuggerPresent mit dem Debug-Namespace gearbeitet, über die NtQueryInformationProcess geschaut ob die Daten abrufbar sind, der Childprozess wird geprüft und sogar die Profiler Umgebungsvariablen wie “COR_ENABLE_PROFILING”.
Anstatt dieser Funktion zum checken der Lizenz füllte ich ein String-Array mit 3 Elementen und wies es dem eigentlichen Rückgabewert zu. Danach wird die die LicencedVariable gesetzt -> WIN!
Der Binder ist extra noch unangetastet, wer will kann sich da gerne dran versuchen, eine Cracked Version nehme ich in den Download mit auf.
Extrapunkte gibts wer einen Lizenzgenerator schreibt, wobei das ziemlich kompliziert werden würde. Aber es gilt wie immer: Reversing ist kein Ponyhof
Download: EasyTools Cracked (37486)
Greez Easy
Noch keine Kommentare vorhanden.