Android RE - Quizduell

Die Android Applikation “Quizduell” testet in abwechselnden Spielrunden das eigene und gegnerische Wissen diverser Themengebiete. Wer nach 6 Runden die meisten der Multiple Choice Fragen richtig beantworten konnte, gewinnt und steigt im Ranking auf.

Der eigentliche Fragebildschrim sieht dabei so aus:

Ziel ist es, schon vor dem Auswählen einer Antwort zu wissen, ob diese richtig ist oder nicht. Nach der Auswahl wird die richtige Antwort Grün markiert, alle anderen Rot. Wir müssen also die Activity untersuchen, was nach dem Klicken auf eine Antwort passiert und den Code zum setzen der Button-Hintergrundfarbe schon beim Laden der Activity aufrufen.

Wie schon beim Billiard RE decompilen wir die App zunächst mit apktool, um das Manifest, Strings und Smali-Code zu erhalten. Dann entpacken wir die App und wandeln den .dex-Code in eine jar-Datei um, welche in JD-Gui geladen wird. Doch welch Überraschung, die Klassen sind obfuscated und nur ein paar Activites erkennbar:

Der eigentliche Quizbildschirm ist gut versteckt und nicht unter den benannten Activities zu finden. Also wählen wir einen anderen Weg: Wir suchen einen (statischen) String, der nur in dieser gesuchten Activity zu finden ist. Die Fragen und Antworten sind dafür ungeeignet (dynamisch geladen), aber was ist mit “Runde X gegen Y”? In der Strings.xml sind alle Strings mit internem Namen zu finden. Durch diesen internen Namen erhalten wir über die Public.xml die “Namen -> Token” Verknüpfung. Die Suche nach “Runde” liefert Erfolg!

<string name=”game_round_vs_xx” formatted=”false”>Runde %d gegen %s</string>
<public type=”string” name=”game_round_vs_xx” id=”0x7f0b0053″ />

 

Weiterlesen

11 people like this post.

Ex.FM Downloader – Release

Zur Preview gibts hiermit nun die Release. Vor dem Download und einer Auflistung der Features möchte ich wie versprochen noch ein paar Worte zu WPF in diesem Projekt verlieren.

Das Projekt trennt strikt zwischen Programmlogik und UI. Alle Interaktionen von oder nach der UI werden über sog. Bindings realisiert. Diese werden (im Optimalfall) aktualisiert, sobald sich die gebundene Property ändert. Damit wird die Änderung auch in der UI sofort angezeigt. In meinem Fall erstellte ich ein sog. DataGrid, dass an eine DataTable bindet. Wird diese DataTable aktualisert, spiegeln sich die Änderungen sofort in der UI wieder. Mit diesem Prinzip kann man nette Sachen machen, und das trennen von Logik und UI macht letzteres leicht austauschbar.

Hier nochmal alle (neuen) Features des Downloaders:

  • Suchfunktion, welche Duplikate entfernt
  • Automatisches ID3 Taggen der Dateien mit den Daten aus Ex.fm
  • Multithread Download
  • Auswahl der Ordnerstruktur / Formatierung
  • Playlisten Download
  • Direkter Download über URL

Im ersten Post war ich auf der Suche nach dem Billy Talent II Album. So sieht eine Suche nach diesem Album in der Suchfunktion aus:

Known Bugs:

  • Programm hat kein Icon (Hab leider kein Grafikprogramm drauf)
  • Manche Songs laden nicht runter (0 Byte wird geschrieben). Dies ist wenn der Song auch auf Ex.fm nicht abspielbar ist (Link Tot etc)
  • Total Running Threads bezieht sich nur auf die Grabber Threads beim Downloaden, für den asynchronen Download wäre das etwas kompliziert gewesen.

Download:

Release:

ExFm Downloader Release (348)

Source:

ExFM Downloader Source (340)

Greez

 

7 people like this post.

MW2 Take Damage Hook - Source Download

Da der Code zum MW2 Take Damage Hook wohl großen Anklang gefunden hat, aber noch einige Fragen offen ließ, ist hier der Sourcecode mit kompilierter DLL zum Download.

Der Source ist echt minimalistisch gehalten, dennoch sollten ein paar Sachen erklärt werden. Das #define in Zeile 2 (MY_PLAYER_ENTITY) definiert einfach die Startadresse des Entity-Arrays. Der Array-Eintrag 0 ist immer der Spieler, daher wird beim Take-Damage Hook geprüft, ob das “Target” dieser Spieleradresse entspricht. In dem EntryPoint der DLL wird geprüft, ob Attached (injected) oder Detached wird. Je nachdem wird der Detour gesetzt oder wieder entfernt.

Der Hook selbst fügt einfach nur den Godmode ein, für alle anderen Spielereien könnt ihr den Source ja selbst kompilen. Zum injecten einfach einen DLL Injector verwenden, meine Wahl ist zur Zeit Winject. Was gibt es sonst noch zu sagen? Die Detour-Lib (detours.h und detours.lib) wird eingebunden bzw mitgelinkt. Kann also so auch in anderen Projekten verwendet werden.

In diesem Sinne: Happy Hacking/Reversing!

Download: MW2 Take Damage Hook - Source (396)

Greez Easy

1 person likes this post.

Ex.FM Downloader - Preview

Ex.fm ist eine Site, die Musik von diversen Streamingdiensten wie Soundcloud und Tumblerblogs sammelt, kategorisiert und in einem Musikplayer abspielen lässt. Klingt nach einem netten Projekt für ein Downloader, oder? Ähnliche Projekte gab es bereits für Grooveshark (Groovedown Downloader) und erst neulich hat mein Blogpartner TheVamp einen ähnlichen Downloader für die Seite BandCamp geschrieben.

Ex.fm bietet freundlicherweise eine API an, die Songdaten in JSon bereitstellt. Alles was es also zu tun gibt ist das JSon zu Parsen und eine nette GUI mit Multithreaddownload zusammenstellen. Also das perfekte Übungsprojekt für WPF! Bisher war ich ja von WPF nicht so begeistert, aber inzwischen bin ich Feuer und Flamme für dieses flexible und dennoch so einfache Presentation Framework. Was man tolles mit WPF anstellen kann, wird an dieser Stelle auf den bald folgenden Blogpost verschoben, denn das würde den Rahmen dieser “Preview” sprengen.

Zum Downloader selbst: Ex.fm bietet sog. Playlists an, die nach Kategorien geordnet sind. Neben den Standartkategorien wie Overall (= Charts), Rock und Hip-Hop gibt es auch für Hörer von klassischer Musik, Dubstep und Indie was auf die Ohren. Die Lieder einer Playlist kann man sich komplett oder in einzelnen Songs herunterladen.

Die Suchfunktion von Ex.fm ist ebenfalls nett. Hier kann man nach Interpret, Titel oder Album suchen. Auf der Suche nach dem Billy Talent II Album bin ich hier auf alle gesuchten Songs gestossen. Eine Suchfunktion ist auch im Downloader integriert, im Optimalfall werden doppelte Suchresultate mit ähnlichen Daten raussortiert.

Natürlich kann man auch Songs direkt runterladen. Hier reicht es, ein Ex.fm Link einzufügen und der Download beginnt.

Weiterlesen

8 people like this post.

MW2 Bot Singleplayer - TakeDamage Hook

Scrollt man in IDA Pro durch die Strings von Modern Warefare 2, so findet man einige nette (und manchmal auch verwirrende) Sachen. So fiel folgender String ins Auge:

.rdata:006CD724 00000021 C ERROR: kill failed for entity %d

Daraus folgt, dass der Befehl zum Töten einer Einheit ein paar Befehle vorher folgte. Und genau da begegnen wir der Funktion, die ich sinniger Weise “TakeDamage” getauft habe. Der Aufbau setzt sich wie folgt zusammen:

char __cdecl TakeDamage(Entity* target, Entity* shooter1, Entity* shooter2, void* unknown1, void* unknown2, int Damage, int nullData, int Flag1, int Flag2, int Flag3, int Flag3)

Nunja, die ersten Versuche mit der Funktion irgendetwas zu erreichen waren ernüchternd. Scheinbar kann die Funktion nicht aus dem EndScene-Hook gecalled werden (falscher Thread?) und auch die Parameter scheinen ziemlich willkürlich zu sein. Die Funktion selbst ist riesig und daher ungeeignet zum Analysieren. Aber hey, wieso nicht mal Hooken? So bekommt man schön alle Parameter ohne diese sich aus dem Stack zu kramen und kann auch gescheites Logging betreiben. Gesagt getan, der Funktionsprototyp wurde geschrieben und gleich eine kleine Umleitung (Detour) eingebaut:

oTakeDamage = (char (__cdecl*)(int, int, int , int , int , int , int , int , int , int , __int64))DetourFunction((PBYTE)0x00492260,(PBYTE)hTakeDamage);

Der Detour funktionierte auf Anhieb! Doch was fängt man mit einem solchen Detour nun an? Das leichteste und naheliegenste ist natürlich folgender Code:

if (target == (int)EntityManager::GetPlayer()-&gt;entityOld)
	{
		return oTakeDamage(target, Normally_two, use_NULL, USE_NULL3, Use_NULL2, 0, a7, USE_ELEVEN, USE_NULL, NOT_19, a11);
	}
	return oTakeDamage(target, Normally_two, use_NULL, USE_NULL3, Use_NULL2, 13337, a7, USE_ELEVEN, USE_NULL, NOT_19, a11);

Hier wurde einfach geprüft ob die “TargetEntity” der eigene Spieler ist. Wenn ja, so wurde die Funktion mit allen originalen Argumenten aufgerufen, bis auf den Schaden. Dieser wird auf 0 gesetzt wenn ich getroffen werde, 13337 bekommen aber Gegner wenn sie Schaden von mir erhalten. So waren alle Schüsse ab jetzt “OneShotKills” und der Spieler befand sich im Godmode. Der Schaden dieser Funktion bestimmt wohl auch welche Sterbeanimation die Gegner abspielen. Bei diesem hohen Schaden denkt die Engine wohl, die Schüsse seien von einem Sniper abgegeben worden und die Gegner fliegen dementsprechend weg. Das betrifft übrigens nicht nur Gegner, sondern auch explodierende Autos und sogar Helikopter ;)

Lustig ist auch den Schaden einfach umzubiegen. Wir prüfen wieder ob der Spieler den Schaden erhält und setzen als neues Target den Schadensurheber. Sobald Gegner auf mich schießen fallen sie angeschossen zu Boden. Wenn Gegner auf den Spieler zustürmen um eine Nahkampfattack auszuführen und dann zu Boden fallen sieht das in der Tat lustig aus :D Und die so verhassten Hunde sterben selbst, nachdem sie dem Spieler eigentlich die Kehle durchgebissen haben. Was für ein Genuss!

Mit dieser Funktion ist es auch ein leichtes einfach alle Gegner auf einmal zu töten. Da hört der (Spiel)Spass aber spätestens auf.

Greez Easy

9 people like this post.

MW2 Bot Singleplayer - Waypoint ESP

Wie bereits angekündigt habe ich mich (wiedermal) an Call of Duty - Modern Warfare 2 gesetzt. Dabei ging es nicht darum, das Spiel kaputt zu hacken, sondern meine Kenntnisse im Bereich C++ und selbstständiges Reversen zu verbessern. Der frühere Bot war meist auf Basis von C&P Snippets diverser Foren entstanden und solange sich der Offset nicht geändert hatte oder der Bot abgestürzt ist, musste man auch kein Debugging/Reversing betreiben.

Doch kommen wir zu dem spaßigen Teil: Waypoint ESP! Es gibt bei MW2 eine Spec Ops Mission, bei der man mit dem Snowmobil durch Tore fahren muss, um Zeit zu gewinnen. Schafft man es die Zeit bis zum Ende des “Rennens” immer im positiven Bereich zu halten, so ist die Mission gewonnen. Auf Stufe “Veteran” gibt das Durchfahren eines Tors nur 3 Sekunden zusätzliche Zeit und damit war die Frustgrenze ziemlich schnell erreicht. Doch bevor wir zu dem eigentlichen Waypoint ESP kommen, sollte ich etwas über “Entites” erzählen.

Jedes Objekt in MW2 ist eine sog. Entity. Diese hat eine ID, einen Namen und sogar meist eine Position. Anhand eines Screenshots sieht man diese Daten ganz gut:

Weiterlesen

1 person likes this post.

Der Blog ist nicht tot!

Hallo zusammen,

lang ist es her seid hier der letzte Blogpost geschrieben wurde. Doch das ändert sich jetzt, denn inzwischen durfte ich viele neue Erfahrungen sammeln und habe auch die ein oder andere Sache entdeckt, über die es sich zu bloggen lohnt. So bin ich inzwischen mit der Schule fertig und bereits in die Uni eingeschrieben. Das sollte aber (hoffentlich) kein Grund kein, den Blog weiterhin schleifen zu lassen!

Freut euch also auf neue Artikel bezüglich Gamehacking (MW2 wurde mal wieder unter die Lupe genommen), Programmieren und natürlich RE-Stuff!

In diesem Sinne bis bald!

Easysurfer

 

3 people like this post.

Android RE - Pool Master Pro

In diesem Post wird es um ein die Basics von Android Reverse Engineering gehen. Das Ziel ist eine Billiard-App namens “Pool Master Pro”. Dazu zunächst einmal ein Vorher/Nachher Bild:

Billiard1

Billiard2

Das Ziel ist es also, die relativ kurze “Aim Linie” zu verlängern, dass wir präzise über den ganzen Tisch zielen können.

Android basiert einer Java VM, und dies ist mehr oder wenig gut zu decompilieren. Dabei entpacken wir erst ein mal die APK (im Zip umbenennen) und sehen u.a. eine “.dex” Datei. Dort ist der komprimierte Source drin. Mit Hilfe des Tools Dex2Jar erzeugen wir uns eine einigermaßen lesbare .jar-Datei.

Allerdings gibt es auch ein weiteres Tool für Android De-und Recompiling names apktool. Dieses nette Tool entpackt alle Ressourcen, Decodiert das XML-Manifest und wandelt auch die .dex-Datei in eine Art Java-VM-Assembler (smali) um (wie bei .NET MSIL). Dieses werden wir nachher patchen. Aber zunächst zu der “Java-Analyse” dank JD-gui.

Die “Aim Line” ist im Optionsmenu an oder ausstellbar. Daher hat dort meine Analyse begonnen. Wir durchsuchen also den ganzen smali-Code nach dem String “Aim” und werden in der Main.smali fündig:

Weiterlesen

5 people like this post.

Reversing ist kein Ponyhof - Intercafe 2013 (die letze)

Hallo meine treuen Blogleser ;-)

Auf bitten einer Person hab ich mir Intercafe 2011 bzw 2013 nochmal angeschaut. Über Intercafe habe mir bereits vor 2 Jahren den Kopf zerbrochen, die damals entstanden Artikel sind in der Serie unten verlinkt. Mit mehr Lebensweisheit und vorallem Erfahrung habe ich also einen weiteren Versuch gestartet, das tückische System zu überlisten.

Wie immer geht es zunächst um die Registrierung des Programms. Dabei ist der Mechanismus bei 2013 genau der selbe wie der bei 2011. Wie in den vorherigen Posts nach zu lesen ist, wird ein Name, ein Softwarecode und ein Softwarekey verlangt. Diese Daten werden nach durchlaufen eines Offline-Checks über eine verschlüsselte Verbindung zum Server übertragen. Wenn diese Daten passen, so ist man registriert. Wenn nicht, so sendet der Server die Anzahl der Tage, die die Testversion schon abgelaufen ist. Da ich auf dem selben PC vor 2 Jahren gearbeitet hab, ist auch das Testdatum das vor 2 Jahren. Somit ist meine Software bereits seid 684 Tagen abgelaufen.

Im letzten Post habe ich von einem Base64-String erzählt, der wohl die Lizenzdaten bereitstellt. Mit dieser Erkenntnis bewaffnet, schaute ich mir diese Lizenzklasse weiter an. Da diese inzwischen in eine ziemlich lesbare, exterene Lib ausgelagert wurde, konnte man sie auch dementsprechend gut analysieren. Aber zunächst etwas Code, der die Server-Response auf eine Login/Registrationsmessage darstellt.

public static void A(string DKSStateString, string st, string string_0, string DKSStateString, string st, string st, string st, string st, string DKSStateString, string st)
{
	try
	{
		e9.C = Convert.ToBoolean(st);
	}
	catch
	{
		e9.C = false;
	}
	e9.E = CLConvertFunctions.ConvertObjectToBool(st);
	e9.A = (E.A(DKSStateString) as CLRegistrationEntry);
	if (string.IsNullOrEmpty(e9.A.RegistrationCode))
	{
		e9.f = "DEMOVERSION";
	}
	e9.G = string_0;

Ziemlich unleserlicher Salat, nicht? Diese Funktion schaltet das Programm frei, oder auch nicht. Denn in dem ersten Parameter wird eine Base64-Serilisierte Klasse übergeben, die im Anschluss als “CLRegistrationEntry” (9te Zeile) gelesen/deserialisiert wird. Wenn nun der Registrations-Code in dieser Struktur “NullOrEmpty” ist, so handelt es sich um eine Demoversion. Weiterlesen

12 people like this post.

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.

Weiterlesen

12 people like this post.