Age of Empires 2 – External Entity Hack

Ich glaube annährend jeder Besucher dieses Blogs hat früher, oder sogar in letzter Zeit als HD Remake, Age of Empires 2 gespielt. Dieses Kultspiel wird hier exemplarisch herrangezogen, um die Schritte beim Programmieren eines Hacks nachvollziehbarer zu machen. Genaue Offsets und Klassen gibt es nicht, wohl aber die Möglichkeit die Schritte nachzumachen. Damit stösst man unweigerlich auch auf die Offsets und lernt den Umgang mit IDA Pro und dem Debugger. Es ist definitiv nicht meine Intention, die Grundlage für einen Hack zu schaffen. Vielmehr hab ich gemerkt, wie schön man das Finden der Entites als Beispiel nutzen und abstrahieren kann.

Am Ende des Blogposts werden wir die Positionen aller Entites und aller Spieler auf eine Grafik plotten können. Natürlich wären weitere Features möglich, aber es geht nur um den Weg bis zu diesem Punkt 😉

Fangen wir mit etwas allgemeinen Informationen an. AoE2 ist wie eigentlich jedes ältere Spiel in C++ geschrieben. Konkret heißt das für uns, dass wir eine Entity-Basisklasse haben, von denen alle Einheiten und Gebäude erben. Im Speicher befindet sich also immer die Basisklasse, gefolgt von den speziellen Attributen je nach Klassentyp. Damit wissen wir auch, dass der erste Eintrag in diesen Entity-Klassen die VTable ist. Das Konzept dahinter wurde schon bei Siedler3 und Interfaces erklärt: Um bei einem Aufruf von „Building->Update()“ und „Unit->Update()“ bei unterschiedlichen Funktionen zu landen, wird der Update()-Funktionszeiger überschrieben, der sich an einer fixen Stelle innerhalb der VTable befindet. Das hat den Vorteil, das wenn wir ein riesiges Array von Entites haben, einfach alle durchlaufen und die Update()-Funktion aufrufen können. Die VTable sorgt dann schon dafür, dass die richtige spezielle Methode aufgerufen wird und wir müssen uns nicht darum kümmern.

Soviel zur gleich gebrauchten Theorie, los gehts in der Praxis mit Memory Scanning. Wie brauchen nämlich eine Variable, die sicher in der Entity-Klasse steht. Optional sollte sie noch leicht zu verändern und eindeutig sein. Was gibt es da passenderes wie das Leben der Entity? Starten wir Cheat Engine und stellen den Typ auf Float. Wir markieren eine Einheit, lesen das Leben ab und verändern es, indemaok1 wir die Einheit einen Gegner angreifen lassen. Zum Glück können wir über F3 das Spiel pausieren, so ist entspanntes Suchen nach der richtigen Variable möglich ohne in die Trickkiste greifen zu müssen. Übrig bleiben sollten zwei Variablen die jeweils das aktuelle Leben anzeigen. Mit der Adresse der Variable selbst fangen wir nichts an, denn spätenstens beim nächsten Spielstart sieht diese ganz anders ist. Spannender ist aber die Funktion von Cheat Engine, über den Debugger herraus zu finden welche Instruktionen auf die Variable zugreifen. Das ist natürlich auch im normalen Debugger über einen Memory-Breakpoint möglich, allerdings bekommen wir bei den doch vielen Zugriffen eine schöne Liste von CheatEngine.

Continue Reading

0

Anonymität – Traceless VPN, PGP und Grundregeln

Das Thema Anonymität im Netz wird immer aktueller. Inzwischen weiß man nicht mehr, welcher Internetverkehr aufgezeichnet wird oder wer hinter dem praktischen Hotspot „Free WiFi“ im Lieblingscafe sitzt. In diesem Post möchte ich daher auf mein Setup eingehen, mit dem ich mich im Netz sicher bewegen kann. Natürlich gibt es immer noch mehr Maßnahmen die man ergreifen kann, aber die wichtigsten Gebiete werden abgedeckt.

Ich gehe hierbei von zwei Szenarien aus, gegen die wir uns absichern wollen: Der Datenverkehr des WLANs wird aufgezeichnet und manipuliert und eine im Internet aufgerufene Website sollte nicht wissen woher und von wem die Anfrage kommt. Im ersten Szenario hilft ein VPN und Verschlüsselung von Daten und Emails, im zweiten Fall tut es ebenfalls ein VPN in Kombination mit dem Wissen über Tracking-Cookies und DNS Leaks. Aber alles ganz langsam, die komischen Begriffe werden alle im weiteren Verlauf erklärt.

Fangen wir mit dem VPN an, da es meiner Ansicht nach den größten Teil der Anonymität ausmacht. VPN steht für „Virtual Private Network“ und wird Hauptsächlich dazu verwendet, über das Internet sicher in ein interes Firmen oder Uni-Netzwerk zuzugreifen. Quasi eine gesicherte Tür über das Internet in ein lokales Netzwerk. Dabei gibt es verschiedene VPN Protokolle, auf die ich garnicht weiter eingehen möchte. WicTL_Networkhtig ist nur, dass alle (PPTP mal rausgelassen) eine sichere Verschlüsselung für die Kommunikation über den VPN bieten. Und genau das kann man auch ausnutzen, indem man den VPN nicht in ein internes Netzwerk leitet, sondern vielmehr alle Daten über diesen VPN in das Internet schickt. Verschlüsselung und Verschleierung der IP Adresse sind dadurch möglich. Ich wähle als Beispiel den Traceless VPN Anbieter. Warum ich für diesen unbekannten VPN Provider Werbung mache? Ich hab die beiden Betreiber auf einer Konfernz selbst kennen lernen dürfen und konnte mir so persönlich ein Bild von ihrem Service machen. Die Philosophie dahinter, die Freiheit im Internet zurück zu erlangen, gefällt mir und der Umfang des Angebots kann sich wirklich mit andren etablierten VPN Providern messen. Durch die Vielfalt der 7 angebotenen VPN Protokolle kann man den VPN auf so ziemlich jedem internetfähigen Gerät nutzen, sogar Windows selbst bringt von Haus aus eine solche Möglichkeit mit. Zum Einrichten empfehle ich euch, die OpenVPN Konfigurationsdateien zu verwenden, da hier bereits alle nötigen Zertifikate und Signaturen drin sind. Continue Reading

1+

RRT – Eine Simulationsumgebung

Warum nicht auch Themen in einem Blogpost verarbeiten, die in der Uni Beachtung fanden und das Interesse auf eine eigene Implementierung wecken? In diesem ersten von zwei Teilen geht es darum, eine Simulationsumgebung für ein Auto zu schaffen, das später diverse Wege und Einparkroutinen findet. Das ganze Funktioniert über Rapidly-Exploring Random Trees, indem man einfach losfährt und dadurch einen Suchbaum aufspannt. Keine Wegfindung, keine Heuristik oder Gradientenfelder, aber vieeele Knoten und Versuche.

Langweilig denkt Ihr? Wenn ihr kein Interesse an dem eigenlichen Thema habt, so lernt ihr doch einiges über C# und objektorientierte Programmierung, welche uns das Leben wieder mal einfacher macht. Den aktuellen Sourcecode findet ihr unten im Anhang, da doch einige „unnötige“ Sachen wie Properties und Hilfsklassen nicht gepostet werden. Hier schonmal eine kleine Vorschau, was die Simulation am Ende vom Post mit wenigen Codezeilen kann:

rotation_colilision

Los ans Coden, beginnen wir mit der abstrakten Enviroment-Klasse. Von einer abstrakten Klasse kann keine Instanz (= kein Objekt) erstellt werden, und das ist auch gut so. Denn die Environment-Klasse dient nur als grobes Schema für alle weiteren Szenarien, daher halten wir sie sehr allgemein. Zunächst reicht es zu überlegen, was eine Simulationsumgebung braucht: Eine Höhe und Breite (ohne Einheit, aber rechnen wir in Metern) , natürlich ein sich bewegendes Objekt (Auto, Lastwagen mit Anhänger, Flugzeug) und eine Liste von Hindernissen, die es zu vermeiden gilt. In Code ausgedrückt sieht es sehr ähnlich aus:

Continue Reading

0

Malware Analysis – SteamStealer, SharpBot RAT und Chrome Stealer

Malware in the Wild! Eines Abends wurde auf einem Twitch Channel ein Link im Chat gepostet. „https://bitly.com/Screenshot093 😀 😛 „. (ACHTUNG MALWARE!) . Dahinter steckt ein Dropbox-Direktdownload und mit einer Screenshot093.scr Datei. Eine SCR Datei, schon lange nicht mehr gesehn 🙂 Eigentlich sind das sog. „Screensaver“-Installer, die allerdings einen normalen PE Header haben und damit einfach als exe umbenannt werden können.

Dahinter steckt ein .NET File, obfuscated mit der neusten .NET Reactor Version. Damit kann de4dot leider noch nicht umgehen, die AES verschlüsselten Ressourcendateien haben eine ungültige Größe. Doch ich vermutete dass die Malware nur ein Loader für weitere Schadsoftware war. Wir nutzen also den ultimativen Ansatz gegen gepackte .NET Files: Dumping. Jeder .NET Assembly wird, wenn nicht speziell dagegen vorgegangen wird, von der .NET Runtime im Speicher gehalten und kann von dort aus wieder extrahiert werden. Wenn der Packer nun die Assembly entschlüsselt und reinläd, können wir uns also einfach das entschlüsselte Image auf die Festplatte schreiben. Der Dump enthält neben der eigentlichen obfuscateten Assembly eine zusätzliche, gedroppte Assembly mit dem eindeutigen Namen „SteamStealer 5.0“. Diese Assembly enthält alles was wir gesucht haben: Ein Steam-Stealer und zwei Loader. Unobfuscated! o/

Dumping

SteamStealer:
Dieses offensichtlich selbstgeschriebene Tool kopiert die beiden „ssfn*“ Files sowie die loginusers.vdf, config.vdf und SteamAppData.vdf in ein Zip-Archiv. Diese sind nötig um den SteamGuard zu umgehen und Items verkaufen zu können. Dieses Archiv wird an folgende URL hochgeladen: http://prtscnhost.com/gate_new.php . Wenn das File keinen PK-Header hat, so werden wir mit der Meldung „Не могу открыть архив“ belohnt. Auf Deutsch heißt das „Kann das Archiv nicht öffnen“, daher können wir annehmen dass das Archiv direkt verarbeitet, ausgelesen und in eine Datenbank eingetragen wird.

Continue Reading

0

Code Injection und dynamische String Decryption

Bei der Analyse eines Programm sties ich heute Mittag auf eine String-Encryption der wildesten Art. In dem heutigen Post wird es um die Entschlüsselung dieser String-Encryption mit Mitteln der Code-Injection gehen.

Bei der String-Decryption wurde ein Offset der verschlüsselten Daten in EBX übergeben und im Gegenzug spucke die Funktion den entschlüsselten String in EAX wieder aus. Eine solche Entschlüsselung wurde in dieser Form schon oft gesehn und ist weiter nichts besonders. Folglich vermutete ich ein XOR decrypt in irgend einer Art. Daher staunte ich nicht schlecht, als ich mit einer unglaublich langen und mit mehreren Subfunktionen durchzogenen Methode stand. Eigentlich baut man die String-Decryption nach, aber in diesem Fall gab ich es nach 20 Minuten auf. Aus der Adresse (!) des Offsets wurden nach Bitshifting-Operationen Offsets in andere Speicherbereiche errechnet, die wiederrum mit in die Decryption einflossen. Diese Speicherbereiche wurden wiederrum erst zur Laufzeit berechnet etc etc. Das dumpen dieser ganzen Daten stellte sich als schwierig herraus, daher verfolgte ich einen anderen Ansatz: Code Injection!

StringDecryptDie Idee dahinter ist schnell erklärt: Anstatt dass man die String-Decrypt-Funktion rekonstruiert um sie im Programm zu verwenden, ruft man die Decrypt-Funktion direkt im zu crackenden Programm auf. Man schreibt also Shellcode der nichts anderes macht als einen String zu entschlüsseln. In diesem Fall ist der Umfang des Shellcodes beschränkt, denn wir müssen nur den gewünschten Offset in EBX laden, die Funktion aufrufen und das Resultat aus EAX auswerten. Uns werden dabei noch einige Steine in den Weg gelegt, aber über die steigen wir nach und nach drüber. Fangen wir erstmal damit an, wie der Shellcode überhaupt ins Programm gelangt und ausgeführt wird.

Continue Reading

0

HearthstoneCalc – Injecting

Der Werdegang von HearthstoneCalc hat einen eigenen Post verdient, in welchem dann weitere Ansätze (Monte Carlo Tree Search) vorgestellt werden. In diesem Blogeintrag geht es allerdings um das Injecten und Daten abrufen aus Hearthstone. Denn ohne Daten aus dem Spiel müssen wir HearthstoneCalc garnicht mehr weiterentwickeln.

Uns wird es zum Glück leicht gemacht. Hearthstone ist mit der Engine Unity3D geschrieben. Für Blizzard hat das den großen Vorteil, das Spiel einfach auf mobile Geräte (Tables und Smartphones, Android und iOS) portieren zu können. Für uns hat es den großen Vorteil, dass Unity .NET (genauer gesagt: Mono) verwendet. Und da die Binaries noch nicht einmal obfuscated vorliegen, haben wir ein relativ einfaches Spiel.

Der für Unity relevante Code wird in der Assembly-CSharp.dll gespeichert. Die Anzahl der Klassen überschreitet alles, was ich bisher gesehen habe. Dementsprechend fällt es am Anfang schwer, uns zurecht zu finden. Auch muss man sich zunächst an die Unity-Eigenarten gewöhnen: Jedes Objekt ist eine Entity, die wiederrum mehrere Unterentities haben kann. Oftmals haben Klassen Unterklassen, enthalten viel zu viel Renderlogik oder scheinen nie erzeugt zu werden.

GameStateDiagDaher gilt zu klären: Welche Daten müssen wir alle Abrufen? Die Daten aus dem Spiel müssen in die Strukturen von HearthstoneCalc gebracht werden. Die wichtigste und größte Struktur ist hierbei die GameState-Klasse (Links). Sie enthält das Spielfeld mit den Monstern, die Karten des Spielers und die Infos über die jeweiligen Helden. Natürlich haben die Helden weitere Unterklassen, wie z.B. die ausgerüstete Waffe oder die gesetzen Geheimnisse. Auch Monster sind inzwischen komplexer geworden, denn sie können verschiedene Buffs besitzen und auf andere umliegende Minions Einfluss ausüben.

Die Klassen aus Hearthstone können wir nicht einfach übernehmen, denn sie enthalten viel zu viele Informationen. Diese Klassen sind nicht dafür ausgelegt, Millionen möglicher Boardzustände zu speichern. Zu diesem Problem werde ich nächsten Post über HearthstoneCalc noch mehr sagen.

Der große Vorteil von Mono ist natürlich, dass wir realtiv einfach .NET Code ausführen können. .NET Code in einem Programm ausführen? Klingt doch sehr nach CLR-Hosting!? Leider ist das nicht so einfach, denn die Unity-Klassen mögen es nicht, wenn sie außerhalb von mscorlib.dll Thread aufgrufen werden. Versucht man eine Unity-Funktion direkt aufzurufen, so erhält man folgende Fehlermeldung zu gesicht:

Continue Reading

0

HearthstoneCalc – Einstieg und Abstaktion

In diesem Post werde ich etwas über mein aktuelles Freizeitprojekt „HearthstoneCalc“ berichten. Ich werde fortsetzende Posts über das Tool danach richten, wie interessiert Ihr Leser an den Artikeln seid. Schauen wir mal 😉

Ich interessiere mich schon länger für Spiele KIs und bin der Überzeugung, dass Computer bei  der Planung von Spielzügen weit effektiver sind als ein menschliches Gehirn. Dabei geht es nicht um die Kreativität die ein menschlicher Spieler an den Tag legt, sondern die reine rationale Beurteilung der Spielsituation. Schachcomputer sind inzwischen ungeschlagen, weil sie einfach Unmengen an Situationen vorraussehen und bewerten können. Seid einiger Zeit fasziniert mich das Spiel „Hearthstone„, ein Rundenbasiertes Kartenspiel ähnlich Magic oder Yu-Gi-Oh. Man kann Diener oder Zauber spielen, die eigenen Heldenfähigkeiten nutzen oder mit Waffen die Kontrolle über das Board behalten. Der Spielverlauf wird später nochmal genauer erklärt, jetzt geht es erstmal um das Programm „HearthstoneCalc“.

Ziel des Programms ist es, alle möglichen Züge zu eruieren und den besten auszuwählen. Dabei sollte das Programm den aktuellen Spielstatus auslesen, die Berechnungen durchführen und den Spielzug selbstständig ausführen. Im Gegensatz zu Spielen mit perfekten Informationen wie Schach oder Vier-Gewinnt haben wir bei Hearthstone drei große Probleme:

  1. Die gegnerischen Karten sind unbekannt. Zwar werden von den Spielern meist ähnliche und als effektiv geltende Decks gespielt, allerdings varieren auch hier die Karten. Die Karten des Gegners die er auf der Hand hat sind verdeckt und bieten daher keine perfekten Informationen über zukünftige Spielzüge
  2. Hearthstone braucht keinen Skill, sondern nur Glück„. An diesem Zitat ist leider viel wahres dran. Viele Zauber wirken auf alle Einheiten verteilt und viel Schaden (z.B. von explodierenden Bomben) ist variabel. Glück gehört einfach zum Spiel dazu, daher kann man den Ausgang eines Zuges nicht effektiv berechnen. Man muss mit Wahrscheinlichkeiten rechnen, und davon nicht wenige. Später gibt es ein Beispiel, wie komplex ein solcher Zug sein kann.
  3. Manche Decks verfolgen eine spezielle Strategie und sammeln daher Karten, um einen großen Zug zu machen. Solch eine „Strategie“ bringt man dem Computer schlecht bei, vorallem da er nebenher darauf achten muss, nicht gegen den Gegner zu verlieren.

Ihr merkt, das Projekt wird komplex. Und ein solches Projekt fängt man am besten an, indem man abstrahiert und vereinfacht. Ein solch einfaches Modell kann dann später erweitert werden. Effektiv heißt das auf die beiden oberen Punkte bezogen: Wir schauen zunächst nur den aktuellen Zug unseres Spielers an und lassen die mögliche gegnerische Reaktion außer Acht. Zudem berechnen wir nur die Züge ohne Wahrscheinlichkeiten bzw Rechnen mit dem schlimmsten Ausgang für uns.

Continue Reading

0

Cryptoanalyse – Known Plaintext

Es folgt der versprochene Beitrag zur Crypto-Analyse eines Usernet Account-Checkers. Dieser erlaubt es, den Account-Status per BB-Code in andere Seiten grafisch einzubinden. Klingt eigentlich nach einer netten Sache… Wenn dabei nur nicht die Account-Daten übergeben werden! Denn das PHP-Skript, welches das Bild erzeugt nimmt Usenet Username und Passwort als GET-Parameter entgegen. Um zu verhindern, dass die Accountdaten ausgelesen werden, wird der Accountname verschlüsselt.

usenetcheck

Ein solcher Include-Link sieht folgendermaßen aus:

usenext-check/image.php?a=vLjWqt+jvNGWm9S54bU==&p=dGVzdA==

Mit  dem scharfen Kryptoanalyse-Blick stellt man fest, dass a (der Accountname) und p (das Passwort) Base64 encodiert sind. Während das Passwort einfach ASCII-Encoded ist, bekommt man beim Decoden von Parameter a zunächst Probleme. Denn es hängt ein Gleichheitszeichen zu viel hinten dran! Wenn man dieses überflüssige Zeichen entfernt lassen sich die Daten zwar encodieren, aber es handelt sich nicht um einen ASCII-String. Anscheinend ist der Accountname verschlüsselt.

Nun haben wir den großen Vorteil zu einem Accountnamen den Chiptertext generieren können. Also haben wir eine Known-Plaintext-Attack und kommen mit etwas Glück auf den Key. Füttern wir den Account-Checker mit ein paar Werten und schauen uns das Resultat an. Vielleicht stellen wir ja Gesetzmäsigkeiten fest…

Continue Reading

0

CSCG geht in die nächste Runde

Die Cyber Security Challenge Germany Qualifikation hat erneut ihre Pforten geöffnet. In den kommenden drei Monaten kann man  in den 12 Aufgaben rund um Web-Security, Exploiting, Reverse Engineering, Cryptografie, Stegografie und Forensik sein können unter Beweis stellen. Warum ich dafür Werbung mache? Es ist ein cooles Event und die Aufgaben sind anspruchsvoll genug um Vorlesungen mit rumrätseln zu füllen. Man beschäftigt sich mit Themen, die einem noch nicht so geläufig sind und trifft coole Leute die Ahnung von Security haben.

Vorraussetzungen sind einzig, dass man zwischen 18 und 31 Jahre ist, noch keinen Master-Abschluss hat und aus Deutschland kommt. Für Östereich und Schweiz laufen übrigens ähnliche Qualifikationen, die dann im EuroCTF gipfeln.

Schaut vorbei und vielleicht sieht man sich in Berlin 😉

 

P.S. Es werden demnächst wieder andere Beiträge kommen. Freut euch schonmal auf Deobfuscation in C# und ein bisschen Crypto-Analyse eines Online-Account-Checkers.

0

DroidJack – Guter Ansatz, schlechte Implementierung

Heute geht es mal wieder um Malware, genauer gesagt um das Android Remote-Administration-Tool DroidJack. Für dieses überteuerte Tool wird es zwar keinen Leak geben, aber dafür ein paar Infos über den Crackschutz. Getreu nach dem Motto: „Guter Ansatz, schlechte Implementierung“.

DroidJack wirft dem Benutzer beim Öffnen des Programms einen Login-Bildschrim entgegen. Durch sniffen wird schnell klar, dass die Logindaten mitsamt Hardware-ID an die Access/DJ4.php des Servers geschickt wird. Ein Punkt gibts bereits Abzug, es wird kein HTTPS verwendet 😉

DJ

Java-Programme lassen sich, ähnlich wie .NET, einfach analysieren. Zumindest solange der Java-Zwischencode nicht verunstaltet wurde, denn in dem Fall versagen die gängigen Decompiler. Die meisten dieser Codeverunstalter-Tools (Obfuscatoren) ändern die Typenbezeichner, Klassennamen, Methoden und alles sonst, was Informationen enthalten könnte. Der hier verwendete Obfuscator schaffte es aber zugleich, Fehler beim Decompilen zu erzeugen. Somit musste ich mich mit dem Java-VM-Bytecode arbeiten, der ähnlich wie MSIL aufgebau ist. Da mir das zu blöd war, schaute ich mir erstmal die DJ4.php Datei an.

Continue Reading

0

Seiten:1234567...13