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:

Weiterlesen

5 people like this post.

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.

Weiterlesen

7 people like this post.

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…

Weiterlesen

9 people like this post.

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.

8 people like this post.

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.

Weiterlesen

5 people like this post.

Sicherheit in Onlinespielen - Wichtige Grundregeln

Egal ob Browsergame oder Multiplayer PvP, Onlinespiele sind in der heutigen Zeit sehr gefragt. Es macht einfach mehr Spass, gemeinsam mit Freunden zu Spielen, statt sich mit einer pseudoklugen KI an der Seite herrum zu schlagen. Der Trend geht klar Richtung Onlinespiele, was wiederrum auch Gamehacker anlockt. In dem heutigen Artikel werden Grundlagen besprochen, auf die man beim Programmieren achten sollte. Anschaulich wird das ganze durch Beispiele erklärt.

Das Spektrum von Hacks, über Bots und Exploits ist zu groß, als dass man es alles in einem Artikel abdecken könnte. Daher werden primär nur Echtzeit-Onlinespiele betrachtet. Diese Techniken lassen sich aber beliebig auf andere Multiplayer-Spiele übertragen. Und noch kurz zu den verwendeten Begriffen in diesem Artikel:

  • Server: Dabei handelt es sich um einen zentralen (!) Server, der das eigentliche Spiel hostet. Er nimmt Daten von anderen Spielern entgegen und verteilt die “Änderungen” im Spiel an alle verbundenen Clients. In machen Spielen wird der Server auch als “Host” bezeichnet, was im Prinzip nichts anderes bedeutet.
  • Client: Ein Spieler, der mit dem Server verbunden ist und aktiv Stati (Schießen, Laufen) an den Server sendet

Der wohl bedeutenste Grundsatz dürfte sein: Traue nie den vom Client empfangenden Daten. Der Client schickt, wie schon oben erwähnt, in regelmäsigen Abständen Daten wie seine eigene Position und seine Attribute an den Server. Wenn ein Gamehacker die Welt-Position des Clients verändert, wird diese auch zum Server gesendet. Wenn der Server diese Daten nun ungeprüft übernimmt, haben wir einen sog. Teleport-Hack. Solche Teleport-Hacks befanden sich u.a. in großen Onlinespielen wie Metin 2.

Während sich der entstehende Vorteil durch Teleportierungen noch in Grenzen hält, hört der Spass bei sog. Masskill-Hacks auf. Dabei sendet der Client die Nachricht “Ich habe XX Schaden am Gegner Y gemacht”. Der Server übernimmt dieses ungeprüft und tötet den Gegner Y. In Battlefield 3 ist dieser Hack inzwischen gefixxt, die Kollisionserkennung ist allerdings immernoch Clientseitig. So sind “Instant Kills” möglich, indem man einfach den Schaden, den eine Waffe verursacht, ins unendliche erhöht. Daher die Regel Nummer 2: Auf Plausibilität prüfen! Im Falle einer clientbasierten Kollisionserkennung kann man durch Wände schießen. Wenn der Server nun einmalig prüft, ob Spieler X den Spieler Y überhaupt treffen kann, wären solche Hacks schon verhindert. Warum das nicht gemacht wird? Weil solche Checks relativ viel Rechenleistung brauchen und einen Server mit 64 Spielern überfordern würde.

Weiterlesen

8 people like this post.

Stämme Bot - Timing ist alles

Heute geht es um präzise tickende Maschienen und ein Projekt, das nun doch ziemlich komplex geworden ist. Ein Stämme Bot!

Doch zunächst etwas in eigener Sache: Vielleicht bist Du hier, weil Du mehr oder weniger freiwillig von Keller-Elite auf diese Seite weitergeleitet wurdest. Hoschi111 war so nett, nach der Schließung von Keller-Elite die User hier her zu leiten. Ist eine große Ehre für mich und ich hoffe es gibt hier den ein oder anderen Artikel der Dich interessiert.

Ich weis nicht, ob Du schon Erfahrung im Browsergame “Die Stämme” gemacht hast. Wenn nein, hier eine kurze Einführung: Um ein anderes Dorf zu erobern (im Stämmejargon auch “adeln”) muss man zwischen 3 und 5 erfolgreiche Angriffe mit einem Adelsgeschlecht auf das Dorf führen. Jedes Adelsgeschlecht (kurz AG) senkt die Zustimmung der Bevölkerung um 20-35 Prozent. Nach und nach sind die Dorfbewohner gewillt zum Angreifer überzulaufen. Dies möchte der Verteidiger natürlich verhindern und schickt allerei Defensive Einheiten in den Kampf um das Dorf zu verteidigen. Manchmal ist die Übermacht aber so groß, dass die eigene Verteidigung nicht standhält. Und dann tritt Plan B in der Kraft: Das “raustimen”. Da die große Offensive vor den AGs angreifen muss, um das Dorf von jeglicher Verteidigung zu befreien, laufen verschiedene Angriffswellen auf ein Dorf. Zumeist sind das ein bis zwei große Offensiven und direkt dahinter die AGs. Die AGs greifen meist mit nur geringem “Begleitschutz” an, denn eigentlich ist das Dorf ja leer. Und meist werden alle verfügbaren Einheiten bei der großen Offensive gebraucht.

Der Clou ist nun das “Timen” dieser Angriffe. Man möchte dem Verteidiger möglichst wenig Chancen geben, zwischen den beiden Angriffswellen (Offensive und AGs) Unterstützung im Dorf zu plazieren. Also folgen die Angriffe im Optimalfall wenige Zehntelsekunden aufeinander. Da man 4 Angriffe für die AGs möglichst Zeitnahe aufeinander losschicken muss, wird die Sache spannend. Es gibt extra Tools im Internet zum üben des “Timens” dieser Angriffe. Doch in was in der Computer uns weit vorraus? Richtig, Timing!

Aus einem Tool, das lediglich Planngszwecke erfüllen sollte, ist so ein mehr oder weniger komplexer Bot geworden. Ein paar Bilder sagen wie immer mehr als Worte:

DSBot_1

Weiterlesen

7 people like this post.

World Conqueror 2 - IAP Purchase Hack

Gab schon lange nichts mehr zu Android RE, das muss sich ändern ;) Ein guter Freund fragte mich nach einem Hack für das Androidspiel World Conqueror 2. Über das Spiel selbst kann ich euch nichts erzählen, dann ich hab es bisher nicht gespielt. Wichtig ist nur, dass es Medallien gibt die man per “In App Purchase” (IAP) kaufen kann. Mit diesen Medallien kann man sich Abzeichen kaufen, welche wiederrum Boni auf Rohstoffe und Kampfeinheiten geben. Ohne diese Boni ist das Spiel irgendwann nicht mehr zu schaffen, das typische Free-To-Play and Pay-To-Win Prinzip. Aber wir schaffen uns heute Abhilfe.

Screenshot_2015-01-01-18-59-12

Wir decompilen die App gewohnt mit Apktool und Dex2Jar und stellen fest, dass das eigentliche Spiel in nativem Code vorliegt. Für uns heißt das mehr Arbeit, natives Debugging und stundenlange Suche in ARM-Opcodes. Aber zum Glück gibt es eine Schnittstelle des nativen Programmes zu dem einfach zu analysierenden Java-Code. Denn die Google-Käufe werden natürlich über normales Java abgewickelt und müssen dann ihren Weg in die native Bibliothek finden. Dazu finden sich folgende Funktionen im Java-Code:

private static native void AddMedal(int paramInt);
private static native void CallNativeError();
private static native void CallNativeExit();
public static void DeviceNotMatch();
// *Snip*
public static native void PurchaseSuccess(int paramInt);

Das “native”-Schlüsselwort sagt dabei, dass sich die Funktion nicht im Java-Code befindet, sondern in einer nativen Bibliothek zu finden ist. Wenn wir diese mit IDA Pro öffnen, finden wir u.a. folgenden Code:

Weiterlesen

4 people like this post.

GemBox Keygen - Modulo ist das Schlüsselwort

Lange ist hier nichts geschehen, ich hoffe trotzdem dass der eine oder andere treue Leser mitbekommt dass ein neuer Artikel online ist. Ich verspreche dass spätestens ab dem 15. Januar wieder mehr Posts kommen werden. 15. Januar aus dem Grund, da dort die Cyber Security Challenge Germany endet. 13 Aufgaben sind bei der Challenge online gestellt und zehn davon wurden bereits von mir gelöst. Diese Lösungen erforderten zum Teil viel Denk/Programmierarbeit, daher werden auch ein paar als Lösungen in diesem Blog verewigt. Gerade in den Gebieten Crypto und Forensik musste ich mich durchbeißen, daher ist ein Blogpost zum wiederholen der Materie ziemlich gut. Und um generell CTF Writeups zu üben ist heute ein kleiner Serial-Keygen dran.

Auf der Suche nach einem C# Wrapper für ein Word Dokument, welcher nicht Office.Interops verwendet, stiess ich auf GemBox.Document. Diese Library hat alles geboten was ich brauchte. Wäre es denn nur nutzbar gewesen. Denn nach 20 Dokument-Elementen sagt die Software:

Free version limitation has been exceeded (Free version is limited to 20 paragraphs)

Das Interesse war geweckt und mit der Zeit stellte sich auch herraus, dass dieser leichte, aber nicht triviale Serial-Algorithmus perfekt für den Blog als Writeup geeignet ist. An dieser Stelle ein Danke an die GemBox-Entwickler ;) Beim Laden der Library in ein .NET Obfuscator unserer Wahl stellt sich schnell herraus, dass die internen Methoden obfuscated sind. De4Dot schafft wie immer Abhilfe und macht zuverlässig alle Verschleierungen des “Eazfuscator.NET 3.3.149 - 3.4″ rückgängig. Die Methoden- und Typnamen können zwar nicht wiederhergestellt werden, aber dieser Luxus ist eh die Ausnahme.

Um die Library verwenden zu können muss die Komponente über ein “ComponentInfo.SetLicense(“0000-0000-0000-0000″)” registriert werden. Wenn der Serialkey dem Format, welches später besprochen wird, entspricht, so ist die Komponente für die Verwendung freigegeben. Andernfalls wird eine Exception geworfen. Unsere Suche fängt demnach bei der SetLicense-Funktion an.

public static void SetLicense(string serialKey)
{
	ComponentInfo.class919_0.method_0(serialKey);
}

Nicht sehr aufschlussreich, es wird auf eine interne Klasse verwiesen. Diese wird später noch interessant, merk euch also den Namen Class919. Die Funktion method_0 macht nichts anderes, als den Lizenzkey in den Klassenmember “string_0″ zu kopieren (merken!) und danach die Funktion wieder zu verlassen. Über ILSpy und das Analyse-Fenster finden wir Methoden, welche den Lizenz-Key wieder lesen. Und dieses sind zum Glück nur zwei, von denen eine die gerade schon gefundene Methode zum setzen des Lizenzkeys ist. Bleibt also die andere Methode, welche ziemlich direkt unser Lizenzcheck ist.

serial1

Weiterlesen

5 people like this post.

Brute Force mal anders - Stämme Cracker

Eines meiner ersten Programme, damals noch mit C++.CLI, war ein Stämme Cracker. Als Grünschnabel habe ich mir damals Sourcecode zusammengesucht und so 10 Webbrowser-Controls gleichzeitig kontrolliert. Aus Nostalgiegründen, aber auch um zu zeigen dass sich in der Browsergame-Welt nicht vieles geändert hat, wurde nun ein neuer Cracker geschrieben. Um diesen wird sich der heutige Artikel drehen.

Fangen wir chronologisch an. Das Browsergame Die Stämme gibt es seid 2003 und hat seitdem massiven Zuwachs erfahren. Inzwischen wurde die 112te Welt gestartet mit mehreren Millionen aktiven Spielern auf allen Servern zusammen. In einem Thread auf Free-Hack ist damals ein Username-Grabber und Cracker erschienen, welcher mein Interesse geweckt hat. Stämme hatte damals, wohl mehr aus Debugzwecken, eine Liste von allen Usernamen auf der aktiven Welt in einer Liste gespeichert, welche per WebAccess zugänglich war. Dieser besagte User von Free-Hack stieß wohl auf diese Liste und schrieb prompt einen Cracker dafür, höchstwarscheinlich den ersten Stämme-Cracker überhaupt. Wie komme ich zu dieser Vermutung? Nunja, die Stämme Server waren auf solche massiven Zugangsanfragen nicht vorbereitet: Anstatt nach ein paar Versuchen die IP zu bannen, konnte man munter fröhlich so viele Username-Kombinationen ausprobieren wie man wollte. Und nachdem einige User von Free-Hack dieses Tool massiv nutzten, waren die Stämme Server komplett down-ge”DDosed”. Das Tool selbst war simple: Es grabbte die Username Liste und probierte dann pro Username ein paar Standartpasswörter wie “qwertz” und “passwort” durch. Die Erfolgsquote damals war erschreckend hoch. Bei 1000 Usernamen fand man locker 50 Accounts die man für seine Zwecke nutzen konnte. Mein damaliges Tool war natürlich weit unperformanter wie der Cracker von Free-Hack, aber das Erfolgserlebtnis dass man wirklich einen Account durch ein eigenes Tool gebrutet hatte wird mir immer in Erinnerung bleiben.

Ca. 7 Jahre später ist sowohl Stämme, als auch meine Programmierkentnisse weiter gereift. Aus Spass fing ich mit ein paar Leuten an wieder Stämme zu spielen. Und da kommen solche alten Gedanken wieder hoch :) “Wird es immernoch möglich sein, auf diesem Wege an Accounts zu kommen?”. Prompt wurde programmiert und prompt war auch schon das erste Problem vorhanden: Wie kam man an die Usernamen? Stämme bietet glücklicherweise eine Rangliste an, in der 25 Accounts pro Seite aufgelistet sind. Also wurde ein Login sowie ein Grabber geschrieben, um an die besagten Benutzernamen zu kommen. Da ich nur an Spielern interessiert war, welche besser wie ich sind, wurden die obersten 15000 Plazierungen ausgelesen.

temp

Weiterlesen

13 people like this post.