Unpacken ist out, Memory patchen ist in!
Heutzutage ist der einzig weiterhin effektive Obfuscator Confuser. Er bietet die Verschlüsselung von Methoden an, das schon öfter angesprochene Proxy-System und vieles weitere, kurzerhand alles um einem Cracker das Leben zur Hölle zu machen. Nennt man die Methoden um, funktioniert das Proxy-System nichtmehr. Schreibt man die Assembly neu, so sind die Ressourcen unbrauchbar. Confuser zu entpacken heißt alles oder nichts, denn alles ist miteinander verknüft. Wenn man nicht alles entschlüsselt, bekommt man kein lauffähiges Programm.
Doch es gibt eine Lösung: Debugger! Bereits vor einigen Monaten habe ich ein String-Decrypter System vorgestellt, dass auf Basis des mDbg Debuggers dynamisch Strings entschlüsselt. Die Vorteile von Debuggern liegen klar auf der Hand: Wenn man einmal die Anti-Debug-Funktionen entfernt hat, kann man das Programm analysieren und auch zur Laufzeit verändern. Kein neues erstellen der Exe ist von Nöten, die Methoden und Strings sind entschlüsselt im Speicher und da das Programm immernoch vom .NET Framework gelesen werden muss, macht uns die Metadata-Zerstörung auch nichts aus.
Mich haben in letzter Zeit gefühlte tausend Emails und Nachrichten erreicht, mit der Frage ob man den FUT Autobuyer cracken kann. Meine Antwort bestand stehts aus Links zu Threads die erklären, wie man Confuser zumindest halbwegs entpackt. Alles andere ist dann kein großes Problem mehr, so war es zumindest in der Vorgängerversionen.
In den letzten Stunden hatte ich mir das Programm nochmal genauer angeschaut und eindeutig ein paar Verbesserungen in dem Lizenzcheck gefunden. Dieser war es nicht mehr einfach mit einem 1-Byte-Patch zu umgehen, da nun verschiedene Checks durchlaufen wurden. Lange Rede, kurzer Sinn. Da ich vor Monaten für damals noch Confuser 1.7 einen Delegates Resolver geschrieben hatte, ist dieser auch für 1.9 zum Einsatz gekommen. Schnell wurde klar, dass im Lizenz-Check weiterhin die Anzahl der Tage zurückgegeben wurden, wie hier zu sehen:
int num = Conversions.ToInteger(this.checkLicense(false, true)); if (num == -2) // Bad licence { Interaction.MsgBox(Type2.M_1_T(363325665u, 6800237349727660676uL), MsgBoxStyle.Critical, Type2.M_0_T(566906042u, 11970172468520458147uL)); } |
Zum Vergleich der selbe Code vor dem Auflösen der Delegates:
int num = Delegate112.smethod_0(this.checkLicense(false, true)); if (num == -2) { Delegate113.smethod_0(Class0.smethod_1(363325665u, 6800237349727660676uL), MsgBoxStyle.Critical, Class0.smethod_0(566906042u, 11970172468520458147uL)); } |
Auf jeden Fall kann man per Debugger nur schwer den schon gejitteten Source dieser Methode anschauen oder sogar verändern. Veränderungen in der statischen Exe sind durch die Code-Verschlüsselung unmöglich. Das Proxy-Delegate zu Conversions.ToInteger wird allerdings trotzdem aufgelöst, wenn der normale User auch davon nichts mitbekommt. Was also tun, wenn man diesen Code nicht manipulieren kann? Sehr wohl aber den Parameter von “Convertions.ToInteger”.
Schauen wir uns das doch mal in WinDbg an:
0:005> .loadby sos clr 0:005> !load x:\sosex.dll 0:005> !bpmd Microsoft.VisualBasic.dll Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger Found 2 methods in module 77e21000... MethodDesc = 77e26580 MethodDesc = 77e26594 Setting breakpoint: bp 77E6226A [Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(System.Object)] Setting breakpoint: bp 77E6216E [Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(System.String)]
Nun lassen wir den Lizenzcheck normal durchlaufen, bis wir schließlich bei dem Rückgabewert, der zu einem Integer konvertiert wird, breaken! Natürlich wird als Rückgabewert -1 zurückgeliefert, da wir keine Lizenz haben:
Breakpoint 0 hit */snipp*/ Microsoft_VisualBasic_ni+0x4226a: // Convertions.ToInteger 77e6226a 85f6 test esi,esi
Und dort schauen wir uns das Argument über “clrstack -p” an:
Child SP IP Call Site 0037ef0c 77e6226a Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(System.Object) PARAMETERS: Value () = 0x019d1514
Hmm ok, eine Value. Wir wissen, Check Licence hat eine geboxxtes Object zurückgeben, mal schauen was !mdt dazu sagt…
0:000> !mdt 0x019d1514 019d1514 (BOXED System.Int32) BOXEDVAL=0xffffffff
Ja, ein geboxxtes System.Int32 mit dem Wert -1 (= 0xffffffff). Schauen wir uns doch mal den Speicher in diesem Bereich an:
0:000> dd 0x019d1514 019d1514 6633c770 ffffffff 00000000 6633c83c
Ok, erst scheint eine Type-Referenz zu kommen (Int32), dann der Wert -1. Ändern wir den doch mal…
0:000> ed 0x019d1514+4 0x00000539 // 0x539h = 1337d
Fazit: Klar, normalerweise hätte ich nie gewusst, dass der unbekannte Proxy-Call zu Conversions.ToInteger weiterleitet. Aber allein durch dieses Wissen, konnte in mit dem Debugger an einer Stelle Ansetzen, die zwar vom Confuser-Schutz unabhängig ist, aber trotzdem eine so zentrale Rolle für den Lizenzcheck spielt!
Natürlich kann man das ganze nun auch noch Programmtechnisch umsetzen, es ist genau das Selbe wie in WinDbg, aber ich denke das würde den Blogpost hier sprengen. Nur ein kleiner Ausschnitt:
MDbgValue[] Params = Proc.Threads.Active.CurrentFrame.Function.GetArguments(Proc.Threads.Active.CurrentFrame); byte[] Data = new byte[16]; long Read = Proc.CorProcess.ReadMemory(Params[0].CorValue.Address,Data); // Addr = Zeiger auf die Struktur Int32 Addr = BitConverter.ToInt32(Data, 0); Read = Proc.CorProcess.ReadMemory(Addr, Data); Proc.CorProcess.WriteMemory(Addr + 4, new byte[] { 0x05, 0x39, 0x00, 0x00 }); |
So far
Easy
hi,
auch ich habe schon mehrere anfragen zu diesem programm bekommen, bleibe aber beim guten alten unpacken
ist nicht besonders aufwändig, selbst ein server emulator ist keine herrausforderung. trotzdem danke für das memorypatching tutorial!
Mein erster Ansatz war auch nen Server Emulator, berechet jeweils den Rückgabewert:
Naja, der Coder hat vermutlich nur das lizenz system geupdated und keine funktionen. Warum nicht einfach eine ältere Version benutzen, die noch nicht mit dem Confuser 1.9 geschützt wurden? Man muss halt dann auch den update check raus patchen
http://www.xup.in/dl,37989401/autobuyer321.7z/
Ich persönlich bevorzuge einen server emulator, man muss nichts patchen und man kann immmer schön die neuste version nehmen
Anyway….
Also, ich hab einfach confuser geunpacked und gepatched, wenn man weiß was man machen muss, geht das relativ schnell.
Hab mittlerweile sogar schon zwei autobuyer gecrackt, siehe blog
Leider schon wieder ein neues Update draußen!
Hat dazu jemand einen Link für die Originale Datei von denen?
Oder hat sich schon jemand ans cracken gemacht?
Wäre auch nice wenn du ein tut machen würdest wie man den update check raus patched und ein Server Emulator macht…
Gruß
Ps: Coderz.cc down?
Hi easy,
kann es sein das Du momentan Probleme mit deinen Mails hast, oder allgemein alles abgelehnt wird was nicht PGP nutzt?
Die Mails kommen grad nicht durch, aber daran wird gearbeitet.
Sonst bin ich immer über Coderz.cc erreichbar
Hey könntest du bitte mal genau beschreiben welche checks und wo durchgeführt werden?
Ich hab mal unpackt die deleagtes resolved und die strings decrypted.
Kann man mit ByteMe patchen.
363325665u
Gibt nur einen CheckLicence Funktion, die als Object (Int32 geboxxed) die Anzahl der verbleibenden Tage zurückliefert. Zu erkennen ist die Funktion an den HTTP-Requests und dass der Rückgabewert zu nem Object gecasted wird.