Hardware, COM-Ports und Python

Aus ist es mit .NET, Windows und grafischen Oberflächen! Easysurfer is Python-Begeistert und steuert Hardware an! Weg mit dem Klickibunti-Kram, gebt mir einen Lötkolben und ein paar Drähte! Nein, ganz so schlimm hat es mich nicht erwischt. Dennoch folgt jetzt ein Beitrag, der sich dieses mal etwas hardwarenäher abspielt.

Ich gebe zu dass ich von Elektrotechnik keine Ahnung habe. Vielleicht finde ich es gerade deshalb so toll einen Geldscheinprüfer in der Hand zu haben und ein Protokoll zu implementieren. Man schickt ein Befehl und der Prüfer fängt an zu Blinken, zu surren und schließlich einen Geldschein zu verschlucken. Toll!

Genug der Euphorie, es stellt sich die Frage: Woher hat er so ein Ding? Und wozu braucht er es überhaupt? Ein Freund und ich bauen mit minimalistischer Hardware ein Art Bitcoin-Transfer-Automat. Die Idee dahinter ist simple: Der Kunde wählt einen Betrag und eine Bitcoin-Adresse aus, der Automat frisst die Scheine und transferiert den entsprechenden Betrag in Bitcoin an die eingelese Adresse. Es wird zu gegebener Zeit einen vollen Artikel zu diesem Projekt geben, aber heute ist der Geldscheinprüfer dran.

Es handelt sich um einen Apex 7000 der Firma Pyramid Technologies. Die genauen Spezifikationen interessieren uns gerade wenig, wir wollen das Ding anschließen und Programmieren. Im Lieferumfang waren 2 Kabel dabei: Ein USB zu 6-Pin-Kabel mit welchem man die Firmware flashen und einstellen kann, sowie ein USB zu 18-Pin Kabel, welches noch zusätzlich mit Strom über ein 4 Pin-Kabel vom Netzteil versorgt wird. Wer sich jetzt unter meinem untechnischen gebrabbel nichts vorstellen kann hat hier noch ein frisch fotografiertes Bild:

Apex7000

Nachdem der PC aufgeschraubt, ein Stromkabel geklaut und die Treiber installiert sind kann es losgehen. Angesprochen wird das Teil über einen seriellen COM-Port. Das Gerät sendet keine Daten raus, sofern wir sie nicht anfordern (pollen). Daher schauen wir erstmal ein Blick in die PDF, in welcher das Transferprotokoll beschrieben ist: RS-232 Serial Interface Specifications.

Weiterlesen

8 people like this post.

Apex AntiCheat – Zwiebeln sorgen für Tränen

Weiter geht es direkt an der Stelle, an welcher der letzte Blogpost endete: Das Patchen der ersten Apex Schicht automatisieren und den Rest “debugbar” zu bekommen. Dazu werden wir einen eigenen Loader schreiben, der es uns erlaubt DLLs vor Programmstart zu Injecten und somit bequem Patches ermöglicht.

Erfahrenere Leser dieses Blogs werden sich wundern, warum der Umweg über einen Loader genommen wurde, statt die zu importierenden DLLs direkt in die ImportTable zu schreiben (von welcher sie direkt geladen werden). Nun, Apex schickt Hashsummenchecks der Wolfteam-Binary an den Gameserver, der uns einen Kick spendiert wenn die Checksumme nicht stimmt.

Das Prinzip des Loaders ist quasi von Opcode0x90 Blog geklaut. Die Idee dahinter ist simpel: Wir starten den Prozess im Status “SUSPENDED” und Patchen den Entry Point, welcher zuvor über die PE Header rausgeparst wird, mit EBFE. 0xEBFE ist Assembler-Code für eine Endlosschleife, also ein Sprung der immer auf sich zurückgeht. Somit haben wir ein “laufendes” Programm, welches aber noch nicht richtig gestartet ist. An diesem Punkt können wir bequem DLLs Injecten und im Anschluss den Prozess wieder anhalten. Der EntryPoint wird wiederhergestellt und der Prozess fortgesetzt, dieses mal allerdings mit einem richtigen Programmstart. Da der Blogpost zu dieser Injecten-Technique so gut geschrieben ist, spare ich mir Codesamples aus meinem Loader.

Das nächste Problem ist der Fenstermodus: Um bequem debuggen zu können ist ein Fenstermodus von nöten, da die maximized Fenster bei einem Breakpoint meist einfrieren und sich im Vordergrund befinden. So kann der Debugger unmöglich bedient werden. Das “rausspringen” aus dem Fenster über ALT+TAB liefert eine viel geringere Auflösung und einen nativen Fenstermodus bringt Wolfteam nicht mit. DxWnd, das Tool das bereits bei Sieder 3 gute Dienste geleistet hat, erkennt bei einem normalen Programmstart von Wolfteam das Fenster und setzt selbstständig die Hooks. Nicht so, wenn kein Child-Prozess verwendet wird (den wir ja durch Patchen der ersten Schicht “deaktivert” haben). So muss DxWnd zu seinem Glück gezwungen werden, d.h. wir injecten die DxWnd.dll einfach von “Hand”. Die Hooks werden dementsprechend gesetzt und das Fenster startet gepatched ebenfalls im Fenstermodus. Weiterlesen

5 people like this post.

Apex AntiCheat - Erste Schicht einer großen Zwiebel

Da hat das Reverse Engineering Fieber wieder zugeschlagen und mir dieses mal einen sehr hartnäckigen Gegner entgegen geworfen: Ein Anti-Cheat System Namens Apex (Avital), welches u.a. von den Spielen Wolfteam und StarGateZ verwendet wird. Im konkreten wird es in dieser Serie um das (hoffentliche erfolgreiche) Bypassen des AntiCheats für Wolfteam gehen.

BackGround

Fangen wir mit ein paar Basics an und analysieren, wo wir Apex vermuten: Im Ordner von Wolfteam gibt es einen Unterordner “avital” mit verschiedensten Dateien drin:

axxalog, TrayDlg.bin, ApexProgress.da_, LoadSysControl.da_, ApexProgress.dat, LoadSysControl.dat, SysDownLoad.dll, SysLoad.dll, TrayDlg.dll, ApexProgress.exe, LoadSysControl.exe, Config.ini, vssver2.scc, update.u, apexprogress.xoe, bootthunker.xoe, childprocboot.xoe, childprocfuncloader.xoe, chk.xoe, initgamer.xoe, loaddrv.xoe, packmodboot.xoe, parentprocboot.xoe, parentprocfuncloader.xoe, showerrorinfo.xoe, thegameonlymod.xoe, trdlg.xoe, usedrv.xoe, webd.xoe, AXCMN_DRVMAIN.XSE, axpack.xse

Die .xoe Dateien sind lediglich unbenannte DLL Dateien, welche jeweils 1-5 Funktionen exportieren. Diese werden per GetProcAddr geladen und anschließend aufgerufen. Damit können wir bisher wenig anfangen, denn alle Dateien einzeln zu analysieren wäre stundenlange Arbeit.

Der nächste Ansatz ist der Launcher, welcher Spieleupdates herrunterläd und Wolfteam im Anschluss Startet. Irgendwo hier muss auch Apex geladen werden! Die Vermutung liegt nahe, dass der Launcher das eigentliche Wolfteam-Spiel per CreateProcess startet, also direkt mal OllyDbg angeschmissen und reindebugged:

Address   Value      ASCII Comments
0018D108  /0018D388  ˆÓ   ; |ApplicationName = "C:\Program Files (x86)\Wolfteam\WolfTeam.bin"
0018D10C  |0018D490  Ô   ; |CommandLine = ""C:\Program Files (x86)\Wolfteam\WolfTeam.bin" easysurfer 6c65696465725f6e696368745f6d65696e5f7077 72"
0018D110  |00000000        ; |pProcessSecurity = NULL
0018D114  |00000000        ; |pThreadSecurity = NULL
0018D118  |00000000        ; |InheritHandles = FALSE
0018D11C  |00080000       ; |CreationFlags = 80000
0018D120  |00000000        ; |pEnvironment = NULL
0018D124  |00000000        ; |CurrentDirectory = NULL
0018D128  |0018D168  hÑ   ; |pStartupInfo = 0018D168 -> STARTUPINFOA {Size=72., Reserved1=NULL, Desktop=NULL, Title=NULL, X=0, Y=0, Width=0, Height=0, XCountChars=0, YCountChars=0, FillAttribute=0, Flags=0, ShowWindow=SW_HIDE, Reserved2=0, Reserved3=NULL, hStdInput=NULL, hStdOutput=
0018D12C  |0018D230  0Ò   ; \pProcessInformation = 0018D230 -> PROCESS_INFORMATION {hProcess=NULL, hThread=NULL, ProcessID=0 (0.), ThreadID=0}

Damit können wir doch schon mehr anfangen! Anscheinend startet der Launcher die Wolfteam.bin und übergibt als Argumente den Usernamen, das Passwort (Hex Codiert) und die Nummer 72, die vieleicht für das Patchlevel steht. In Zukunft brauchen wir den Launcher also nicht mehr, um Wolfteam zu starten! Wir Übergeben also Olly unsere Argumente und starten Wolfteam erneut, aber diesesmal direkt. Das Laden/Updaten des Anticheats blinkt kurz auf und schon ist unser Spiel im Fullscreen gestartet. Der Anticheat scheint also schnell geladen zu werden! In OllyDbg die Option setzen, dass er bei jedem neuen Module “anhalten” soll schafft Abhilfe.

Weiterlesen

8 people like this post.

Simplest PHP Counter

Hallo zusammen,

gestern wurde spät in der Nacht einem Bekannten ein minimalistisches PHP Counter Script zusammengebastelt. Mein PHP und MySQL war etwas eingerostet, aber dennoch etwas (hoffentlich) brauchbares draus geworden. Vielleicht fängt ja jemand etwas mit dem Source an oder verwendet es sogar in eigenen Projekten.

Geloggt wird die aufgerufene Seite, der UserAgent, Referer und die IP des Nutzers. Im Panel werden dann die Hits und Unique Hits der letzen 24, sowie die Gesammtanzahl der Hits ausgegeben. Ein paar Statistiken zeigen, welche Seite besonders oft frequentiert wurde.

SimpleCounterSystem

Wenn jemand XSS oder SQLi findet, so darf er mir gerne Bescheid geben!

Download: Simplest PHP Counter (294)

Greez

2 people like this post.

tr4ceflow Crackme/Keygenme 2

2 Tage nach der Veröffentlichung des Keygenme 1 von tr4ceflow gab es Nummer 2 hinterher. Dies war wohl schwieriger und verlangte mehr Geduld. Geduld hat es in der Tat gebraucht, denn bis ich meine Lösung vollständig implementiert hatte vergingen ein paar Stunden.

Aber alles der Reihe nach. Es gibt in diesem Fall 3 Eingabefelder, einmal für den Namen und zwei für die Serial. Nur der Name und die erste Serial hängen zusammen, die zweite Serial wird (bis auf die Länge) nicht vom Usernamen bestimmt.

Fangen wir mit der Analyse an. Ich werde, im Gegensatz zum letzen Artikel, direkt den verschönerten C-Code aus IDA entnehmen und nicht den direkten ASM Code gegenüberstellen. An Anfang wird wieder der Name abgerufen und die Länge des Namens vergleichen. Wenn dieser zwischen 6 und 10 Zeichen lang ist, ist er gültig. Im nächsten Schritt wird eine XORChecksum aus dem Buchstabenindex und dem jeweiligen Buchstaben - 0×30 erzeugt.

usernameLength = GetDlgItemTextA(a1, 40002, usernameString, 200);
  if ( usernameLength - 6 <= 4 )
  {
      currentStringIndex = 0;
      XorChecksum = 0;
      while ( currentStringIndex != strlen(usernameString) - 1 )
      {
        XorChecksum += currentStringIndex ^ (usernameString[currentStringIndex] - 0x30);
        ++currentStringIndex;
      }

Das ist bis hierhin kein Hexenwerk. Weiter geht es mit dem Einlesen der ersten kurzen Serial und dem Vergleich der Länge mit 3 (Code ist zu trivial, daher nicht abgedruckt). Danach folgt der folgende Code der die erste kurze Serial in eine richtige Zahl umwandelt.

Weiterlesen

1 person likes this post.

tr4ceflow Crackme/Keygenme 1

In diesem Artikel geht es um das Crackme/Keygenme 01 von tr4ceflow. Der Crack selbst ist mit einem kleinen Patch getan, aber der Keygen ist anspruchsvoll. Ich selbst habe nicht viel Erfahrung mit Keygenning, zumindest nicht was native Algorithmen angeht. Daher werde ich den Algorithmus, den Code und den Prozess zum Keygen ziemlich ausführlich beschrieben.

Los gehts mit der ersten aufpoppenden Message-Box die es wegzupatchen gilt. Target in Olly laden, starten und nach dem Aufpoppen der Messagebox unterbrechen. Nun im Stacktrace soweit zurückgehen, dass man aus den “System”-DLLs wie Apphelp und USER32 in der eigentlichen Executable landet. In diesem Falle ist das der Stack:

Und die Instructions zu denen dieser RETURN führt:

Wir patchen nur den Call zur Messagebox und die folgende Instruction, nicht das Laden der Argumente auf den Stack. Der hier verwendete Compiler scheint die Argumente nicht direkt per PUSH auf den Stack zu laden, sondern vielmehr den Stackpointer manuell setzen und die Argumente direkt schreiben. Daher muss das SUB ESP,10 ebenfalls entfernt werden. MessageBoxA ruft diese Argumente ab und SUB ESP,10 fixxt den Stack wieder. Da keine Argumente abgerufen werden, muss der Stack auch nicht gefixxt werden.

Weiterlesen

6 people like this post.

Kleiner Artikel, große Wellen

Dies ist mehr ein Nachtrag zum Artikel “Android RE - Quizduell”. In den über 20 Kommentaren hat sich in den letzen vier Monaten viel getan. Es wurden untereinander Tipps zum Recompilen verteilt und Informationen über die API und das Sniffen über HTTPS zusammengetragen. Gerade eben erreichte mich ein weiterer Kommentar zu diesem Artikel, den ich euch nicht vorenthalten möchte. Anscheinend hat jemand die komplette API reversed und ein Bot mit einem Web-Frontend geschrieben:

Hi,
eure Kommentare haben mir wirklich geholfen, ein Interface für die Quizduell-API zu schreiben… das Resultat ist dieser Bot http://quizduellbot.appspot.com :D
Ich werde das API Interface (python) noch auf github hochladen.

Gerade eben hab ich eine Runde gegen diesen Bot gespielt und er funktioniert einwandfrei. Spassig ist es aber nicht die ganze Zeit zu verlieren :D Bin schon gespannt, wann er auf Platz 1 der Ranglisten landet.

Greez Easy

9 people like this post.

NoFuser, Inline Patching und neuer Partner

Hallo zusammen,

in der Blogroll hat sich ein neue neue Verlinkung eingefügt. Der Blog von Tr4ceflow! Er beschäftigt sich mit nativen RE und krazt dabei nicht nur an der Oberfläche, sondern taucht tiefer ein und deckt weiterführende Themen wie Kryptografie ab. Es gibt eh so wenige (deutsche) Blogs, die sich mit solchen Themen befassen, daher bin ich sehr begeistert, dass die Blogpartnerschaft zu Stande gekommen ist. Schaut mal vorbei, es lohnt sich!

Gestern lief mir eine Binary, gepackt mit Confuser 1.9 und so ziemlich allen Protections über den Weg. Der Code war verschlüsselt und nicht in den Methoden zu finden, die ganzen Funktionsaufrufe durch Proxy-Calls geschützt. Also die perfekte Gelegenheit NoFuser auszuprobieren. Und das Resultat war erstaunlich! Der Coder dieses Tools hat meinen vollen Respekt!

Das eigentliche Programm beendete sich sofort nach dem Programmaufruf, deswegen direkt mal zum EntryPoint gesprungen und dort rumgesucht. Nach ein paar Consolenausgaben war ein einzelnen Call zu finden, der direkt zum Ziel führt:

string a = Class3.smethod_2(Class3.smethod_1("c"));
if (a != "105f5cde81c1868f98cf225b10c50f9e")
{
	Environment.Exit(0);
}

Weiterlesen

7 people like this post.

Blog wieder online + Hackit

Hallo zusammen,

habe nun mal ein Backup vom 28. Februar 2014 eingespielt, alle Artikel und Kommentare sind erhalten geblieben.

Es gab ein paar Unstimmigkeiten mit den Plugins. Wenn ihr also auf einen Fehler stossen solltet, gebt mir doch bitte kurz Bescheid.

Die Zeit die der Blog down war knobelte ich an dem neuen Hackit von Unnex. Es gibt 3 Level, die komplett andere Lösungsansätze und Herrausforderungen bieten. Sehr unterhaltsam und auch lehrreich, wenn ihr euch ein wenig für WebSec interessiert.

Bis bald
Easy

7 people like this post.

Siedler 3 - Lobby Preview

Die letzen Tage habe ich wieder viel mit Siedler 3 verbracht. Allerdings nicht mit Spielen, sondern mit Reversing und Coding.

Durch einige Tricks habe ich es geschafft, einzelne UI Elemente zu “kontrollieren” und Aktionen mit ihnen durchzuführen, die eigentlich nur nach einem Mausklick auf das jeweilige Element erfolgen. Denn die “neue” Lobby wird über das LAN-Menu laufen, nur dass der Bildschrim komplett ersetzt wird. Um aber ein Spiel aus dem LAN-Modus zu starten, sind folgende Schritte notwendig:

  • Spieler klickt auf den Adapter in der ersten Listview (DirectPlay Adapter)
  • Spieler klickt in die Textbox und gibt die IP des Hosts ein
  • Spieler klickt auf “Suche Spiele” -> Spiele werden angezeigt
  • Spieler wählt ein Spiel aus der Lisview aus
  • Spieler klingt auf “Mitspielen”.

Diese 5 Schritte kann ich nun per Programmcode aufrufen, auch wenn es noch nicht immer klappt (Bei einem Fehlerdialog hängt sich das Programm auf, da dieser eigentlich nicht vom UIThread aufgerufen wird etc).

Das bedeutet, dass einer neuen Lobby nun nichts mehr im Wege steht. Oder doch? Die eigentliche UI für die Lobby muss ja noch geschrieben werden. Und dabei kann (wegen des alten GDI standarts, leider nicht mal GDI+) auch keine UI Library verwendet werden. Selber schreiben heißt die Devise! In den letzten Tagen habe ich daher einige Basis UI Klassen angefertigt (TextLabel, Button, ListView) um daraus eine Lobby zu konstruieren. Das Resultat:

Weiterlesen

9 people like this post.