TubeDigger - Anti-Debug & TrialPeriod

Es gilt mal wieder etwas neues, natives zu Revesen! TubeDigger ist ein ultimatives Programm zum Downloaden von Streams (z.B. von Youtube und Co). Es ist nicht gepackt, daher kann man es schön Analysieren und vielleicht auch irgendwann Patchen.

In diesem Post geht es nicht darum, ein Programm zu cracken, sondern vielmehr aufzuzeigen, wie schön native Analysen sein können. Wenn sich plötzlich mehrere Fäden zu einem Strang verknüpfen, ist das echtes reverse Engineering! Vielleicht wird es einen zweiten Blogeintrag zu diesem Programm geben, denn dieser erste Post beschränkt sich nur auf Anti-Debug Methoden und auf die Verlängerung der Trial-Periode.

Sobald wir das Programm im Debugger laden bekommen wir es direkt mit einer schönen Fehlermeldung zu tun:

TubeDigger1

Einen schönen Humor haben die Programmierer schonmal. Dieser Blog ist zwar nicht Youtube, aber ich denke das zählt auch :D

Wenn wir uns zu diesem Zeitpunkt den Stack anschauen, so findet sich irgendwo ein Call zu NtQueryInformationProcess“:

0020BC38  |0049EA21  RETURN to TubeDigg.0049EA21 from TubeDigg.0049E920
0020BC3C  |76E60000  ntdll.76E60000
0020BC40  |76EA5130  ntdll.ZwQueryInformationProcess
 Weiterlesen

11 people like this post.

Confuser String Decrypter über mDbg

Der Confuser ist nach wie vor ein aktuelles Thema. Und dabei ist die String-Decryption soweit ich weiß nicht geknackt! Confuser stellt für fast alle Strings eine eigene Decrypterfunktion mit eigener Ressource sowie eigenen Verschlüsselungsparametern bereit. Der reine Horror für jeden, der einen statischen Unpacker schreiben will.

Dieses mal ging es um einen anderen, dynamischen Ansatz: Warum nicht die Strings auslesen, nachdem sie sich entschlüsselt im Speicher befinden? Und da ich bei dem Proxy System von Confuser Erfolg mit WinDbg hatte, ist auch hier zum Debugger gegriffen worden. Microsoft stellt uns eine .NET Debugging API bereit, auch wenn sich kaum etwas darüber im Internet finden lässt. Und genau mit dieser API in Kombination mit ein wenig Confuserwissen, Speicherlayout und .NET ist es möglich, einen Debugger und Unpacker für die Strings zu schreiben. Dabei laufen folgende Schritte ab:

  1. Debugger Instanz erstellen + die Executable laden
  2. Nach dem Laden vom “mscorlib.dll”-Modul ein Breakpoint auf System.Reflection.Module.ResolveMethod setzen (wird von .cctor gecalled, siehe Proxy-System)
  3. Sobald dieser Breakpoint erreicht ist, werden Breakpoints auf alle String-Decrypter Funktionen gesetzt. Der ResolveMethod BP wird entfernt.
  4. Wenn ein Decrypt-BP erreicht ist, so wird aus der Funktion raus gesprungen und der Wert in EAX ausgelesen. Dabei wird der Parameter (Token) von dem Decrypt-Call zusammen mit dem entschlüsselten String abgespeichert.
  5. Alle Decrypt-Funkionen, die ein Token (+ entschlüsselten String) haben, werden mit dem echten String ersetzt.

Kingt nach viel Arbeit und Source? Nicht wirklich. Fangen wir bei Punkt 1 an:

Engine = new MDbgEngine();
Proc = Engine.CreateProcess(@"C:\Users\AL\Downloads\li0nsar3c00l enhanceviews.net bot_patched.exe", "", DebugModeFlag.Debug, null);
 
Proc.PostDebugEvent += Proc_PostDebugEvent; // Jedes Event wird hierhin weitergereicht
Engine.Processes.Active.CorProcess.OnBreakpoint += CorProcess_OnBreakpoint; // ein BP wird als Event gecalled
Proc.Go().WaitOne(); // Wir lassen laufen, bis ein BP erreicht ist.
 
Console.ReadLine();

Weiterlesen

2 people like this post.

Cooles Secunet Hackit

Auf Secunet.to gibt es z.Z. ein Hackit, bei dem es ein anonymen OpenVPN zu gewinnen gibt. Mir persönlich ging es zwar nicht um den Gewinn, aber vielleicht spornt das den einen oder anderen etwas an.

Das Hackit dreht sich rund um SQL Injections. Toll fand ich bei diesem Hackit, dass man nicht nur Querys manipulieren musste, sondern vielmehr auch erstellen. So findet gerade für Anfänger ein Lernprozess statt. Aber keine Sorge, denn Langeweile kommt keine auf: ab Level6 darf man aus Querys ausbrechen, sich an IDS vorbei schleichen und auch blind injecten.

Das Hackit findet ihr unter dieser IP!

Viel Spass!

Easy

11 people like this post.

WarBot NEXON v6 - Cracked

Über CoderZ erhielt ich die Anfrage zum Cracken dieses Bots für das Spiel WarRock. Dabei gibt es sowohl einen “Free”-Mode, als auch den sog. “Premium”-Mode. Für letzteres bedarf es eines Codes, den man zuvor gegen Geld erworben hat.

Leider hat sich die Person, welche mich ursprünglich um den Crack bat, nicht mehr gemeldet, seid ich ihr eine gecrackte Version zum testen zugeschickt habe. Es ist also nicht garantiert, dass die hier gepostete Version funktioniert, ich freue mich allerdings über jedes Feedback ;-)

Des weiteren hat sich der Coder des Bots zurückgezogen und wird dementsprechend auch keine Updates mehr herrausbringen. So ist durch diesen Crack auch kein Schaden entstanden :)

Zurück zum Bot: Nach dem unpacken des Crypto-Obfuscators mit de4dot 2.0.3 gab 2 Features gab es zu patchen. Das erste Feature ist ein Anti-VM Mechanismus, welcher es nicht erlaubt dass der Bot unter einer virtuellen Maschine gestartet wird. Der Check dazu befindet sich gleich im Anfang nahe des EPs:

if (Class3.smethod_4())
{
MessageBox.Show("WarBot is running on a virtual computer. Please run WarBot on a real PC.", "WarBot - Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}

Weiterlesen

4 people like this post.

Weltuntergang, Weihnachten & Co

Nachdem meine Hoffnung auf den Weltuntergang am 21.12.12 nicht erfüllt wurde, wünsche ich Euch allen ein frohes Weihnachtsfest und einen guten Rutsch ins Jahr 2013!

Wie unschwer zu erkennen ist, sind in letzter Zeit wenige Artikel erschienen. Der verhasste Grund dafür ist wahrscheinlich jedem bekannt: Die knappe Zeit! Sobald wieder etwas Luft ist, wird ein Artikel über die String Decryption des Confusers über einen managed Debugger (mDbg), sowie ein wenig neues über Gamehacking in .NET erscheinen. Und bis dahin wünsche ich Euch allen frohes Programmieren!

Easy

 

14 people like this post.

Confuser Unpacker - Videotutorial

Aufgrund einer Bitte folgt hier ein Video, was ein bisschen den Unpackvorgang des Confusers beleuchtet. Es ist auf Englisch geschrieben und ziemlich schnell zusammengeklickt, daher vergebt mir Schreibfehler wie “on” statt “one” oder “weather” statt “whether”.

Durch das Klicken auf die eingeblendeten Texte setzt das Video fort ;-)

Viel Spass beim lernen und anschauen!

Zum Video hier hart klicken!

Easy

6 people like this post.

Die Freude über HRESULT = 0×00000000 - CLRHosting Reloaded

Zunächst einmal muss ich etwas loswerden: COM-Objekte und ihre GUID/CLSID/IDDs sind BLÖD! Seid Stunden sitze ich an einem kleinen Problem, welches sich HRESULT REGDB_E_CLASSNOTREG bzw E_NOINTERFACE nennt. Laut Google müssen CLSID und IID identisch sein, aber hier…:

CLSID_CLRRuntimeHost = 90F1A06E-7712-4762-86B5-7A5EBA6BDB02
IID_CLRRuntimeHost = 90F1A06C-7712-4762-86B5-7A5EBA6BDB02

Suche und finde den Fehler. Jap, ein Zeichen unterschied der GUIDs und alles für den A…..

So, nach diesem kleinen Ausraster direkt zur Einleitung. Es geht um CLRHosting durch Managed FASM, wie bereits in einem Post vor ziemlich genau einem Jahr erklärt. Dabei ist es möglich von .NET ASM-Code in eine native Assembly zu injecten, welche wiederrum eine CLR-Runtime läd um dort .NET Assemblys zu laden und auszuführen. Wozu braucht man das? Zum Beispiel um auf native Bootstrap DLLs verzichten zu können oder böse Malware in nativen Programmen zu verstecken.

In dem erwähnten Post wurde die CLRRuntime 2.X über die Funktion CorBindToRuntimeEx geladen, dies ist allerdings nicht zu höheren Versionen des .NET Frameworks kompatibel. Nun wurde eine andere Lösung gesucht, da viele Libraries inzwischen auf .NET 4 portiert sind.

Die hier vorgestellte Methode ist etwas komplizierter, dafür funktioniert sie für .NET v4.0.30319 und ist abwärtskompatibel. Bei dem früheren CLRHosting reichte es, eine statische Funktion aufzurufen um ein Interface-Handle zu bekommen. Von diesem Interface-Handle reichte es, wiederum eine Funktion aufzurufen, um die CLRRuntime zu starten.

Weiterlesen

7 people like this post.

When managed is not enough - Confuser broken

Nach einem Monat der mehr oder weniger intensivsten Arbeit erscheint hier der nächste große Artikel zum Confuser. Es wird (wiedermal) um das Auflösen des Proxy-Systems gehen. Wem das Proxy-System nicht geläufig ist, kann im vorherigen Artikel sein Wissen nochmal auffrischen.

Doch zunächst ein wenig Vorgeschichte: Ein deutschsprachiger Reverser “li0nsar3c00l” war so nett mir eine Binary zu builden, welche es zu cracken galt. Dieses “CrackMe” wurde mit Confuser 1.9 Aggressive erstellt. Aggressive enthält das Proxy-System (Methoden und Konstuktoren), String-Encryption, Code-Flow-Obfuscation, Anti-Debug und natürlich Type-Renaming. Man muss im Hinterkopf behalten dass es nicht möglich ist eine lauffähige Binary zu erstellen, wenn nicht alle dieser Systeme umgangen sind. Denn jedes System benutzt entweder Signaturen von Methoden, welche sich ändern sobald die Binary neu erstellt wird, oder aber Verrechnungen mit dem MethodToken aus dem Callstack. Das hört sich alles kompliziert an, bedeutet aber einfach dass wir keine neue Binary erstellen können ohne zuvor alles aufgelöst zu haben.

Bevor wir intensiv ans Reversing gehen können, gilt es das Anti-Debug-Modul auszuhebeln. Dazu noppen wir einfach die ganze Methode, unschön aber effektiv. Den Call zu noppen hätte auch gereicht, allerdings wusste ich nicht ob die Anti-Debug Funktion nochmal (dynamisch?) aufgerufen wird. Sicher ist sicher.

Weiterlesen

9 people like this post.

Monodroid - Erste Schritte und ein Sprung

Da ich seid neustem auch ein tolles Smartphone (Samsung Galaxy S Plus) besitze, musste ich doch mal schauen was man tolles damit anstellen kann. Da ich nicht mit Java als Sprache anfangen wollte gab es nur eine Alternative: Monodroid!

Monodroid ist Mono auf Android portiert. Die mitgelieferte IDE MonoDevelop macht einem das Entwickeln wirklich leicht. Durch Verknüpfung mit dem Android SDK lassen sich in MonoDroid Emulatoren und Geräte laden, zur Laufzeit debuggen und natürlich Applikationspakete (*.apk) erstellen.

Da ich weiterhin auf meinem Netbook entwickle hatte ich Probleme die Emulatoren zum laufen zu bringen. Da die Trial-Version von MonoDroid aber nur diese Emulatoren unterstützt habe ich schlichtweg die gecrackte Version verwendet. Das hat den Vorteil dass ich das APK-Dateien erstellen kann, wer also ebenfalls ein Android Phone besitzt kann dieses heute entwickelte Programm ebenfalls nutzen.

Nachdem das Hello-World-Programm lief wagte ich mich an die Erweiterung des Programms, bis schließlich ein 9Gag-Picture-Dumper entstanden war:

Das Programm ließt die Website 9Gag Mobile Website aus und holt sich so viele weitere Seiten des 9Gag-Portals wie angegeben (Im Bild die Zahl 3). Aus diesen Seiten werden die Bilder per Regex geparsed und schließlich nacheinander auf die Interne SD-Karte geladen. Zwar gibt es 9Gag Viewer, diese können aber nur die Bilder anzeigen und nicht herrunterladen. Da ich die Bilder aber gerne ohne Internetverbindung anschaue war so ein Dumper das perfekte Projekt.

Weiterlesen

9 people like this post.

Finite State Engine - Messaging

Basierend auf dem Artikel “Pseudointelligente Gamebots” und der dort entwickelten FSE (Finite State Engine) ist nun eine Erweiterung geschrieben worden.

Es begann mit einem Email-Kontakt mit dem User wieschoo, welcher ein ganz interessantes Projekt am laufen hat: Die BotSuite.NET. Diese Suite stellt bisher Funktionen für Bilderkennung, Benutzereingaben und Ausgaben bereit. Wie gut das funktioniert kann man auf diversen Videos des Autors bestaunen ;-) Eine FSE würde da gut reinpassen, daher bat er mich drum eine solche FSE für ihn zur Verfügung zu stellen. Damit Ihr aber auch davon profitiert werde ich in wenigen Auszügen die Änderungen an der FSE erklären und am Ende das Beispiel etwas näher beleuchten.

Die State-Klasse hat sich etwas geändert. Statt der abstrakten Funktion “Execute” gibt es nun auch “Enter” und “Leave”, welche einmalig beim Ändern des States aufgerufen werden. Zudem muss jeder State “bool OnMessage(BaseEntity, Telegram)” überschrieben, die Funktion zum Handeln einer Message. Mehr zum Message-System gleich, ist nur wichtig im Hinterkopf zu behalten.

Leider ist es bei einem Message-System unabdingbar mit Entites zu arbeiten, sonst würde das Message-System keine Ahnung haben an wen die Nachricht gehen sollte. Daher ist eine BaseEntity mit einer ID und einer abstrakten HandleMessage-Funktion dazugekommen, ein Singleton einer EntityManager-Klasse stellt Funktionen wie “RegisterEntity” und “GetEntityByID” bereit.

Das eigentliche Message-System arbeitet mit sog. “Telegrams”. Ein Telegram besteht einfach aus folgenden Variablen:

public struct Telegram
    {
        public Int32 Sender; // ID des Senders
        public Int32 Reciever; // ID des Empfängers
        public Int32 Message; // ID der Message 
 
        public DateTime DispatchTime; // Zeit, in der die Message abgeschickt werden sollte
        public Object AdditionalInfo; // Zusätzlicher Parameter

Weiterlesen

5 people like this post.