Wolfteam – LithTech und Engine Draw Hook

Manchmal hat man keine Lust auf Anti-Cheats, welche permanent (und aus manch unerfindlichem Grund) Kicks verteilen. Daher beginnen wir mit dem spassigen Teil: Die LithTech Engine und der Draw Hook.

Zunächst ein paar Worte zu der Engine: Die LithTech Engine ist das Herzstück von Spielen wie FEAR, ein paar Medal of Honor Titeln, Combat Arms und Crossfire. Inzwischen ist ein SDK veröffentlicht, das für uns sowohl ein Segen als auch ein Fluch ist. Denn so lässt sich zwar die Basis-Struktur von Klassen nachvollziehen, aber es gibt keine Garantie dass diese Klassen nicht geändert wurden. So kann man sich ein SDK als grobe Orientierung vorstellen, aber nicht als Basis der Programmierung.

Am Anfang war der DirectX Hook. Man hooked dazu (wie schon von Siedler bekannt) die Funktionen EndScene und Reset, um eigene Sachen zu zeichnen. Funktioniert hat das überraschend gut, aber nur bis das Device Resettet wurde. Ein Reset passiert z.B, wenn das Fenster in den Hintergrund geschoben wird und dann wieder Fokus erlangt. Oder auch, wenn man vom der Ingame-GUI ein Match Startet. Aus unerfindlichen Gründen wurde die Font, die ich zum Zeichnen erzeuge, nicht freigegeben. Eigentlich sollte das mit Aufrufen von OnLostDevice() und OnResetDevice() die Font Freigeben bzw wieder neu allokieren. Irgendwas lief schief, so dass ich diesen Ansatz nach ein paar Stunden des Debuggens wieder aufgab.

WolfteamColor

Lassen wir also die Engine das ganze Font verwalten und Strings zeichnen übernehmen. Dazu hooken wir uns in End2DOptimized, was dank diverser Strings in der Binary leicht möglich ist. Interessanter wird es, das Rendern vorzubereiten und wieder zu beenden. Dazu bedienen wir uns das Klasse ILTDrawPrim, welche ebenfalls über Strings schnell gefunden wird. Ein Blick in das SDK liefert auch schöne Klassenmember und virtuelle Funktionen, die wir uns zu nutze machen können.

Continue Reading

0

Apex AntiCheat – Die kommunizierende Zwiebel

Kommunizieren kann Apex also auch noch! Nur leider noch nicht so ganz mit dem Reverser. Denn in diesem Post geht es um das Netzwerkprotokoll und natürlich wie Apex da mit drin hängt. Es werden aber auch die Apex-Module angeschnitten, die bereits in den letzen Posts Erwähnung fanden.

Ein direkter Mitschnitt von Netzwerktraffic ist schwer möglich, da auf jedes Packet auf eine ganz abscheuliche (und ziemlich schwer nachzuvollziehende) weiße von XOR und Bitshifting-Operationen gequält wird. Daher muss auf andere Wege zurückgegriffen werden, um das Netzwerkprotokoll zu durchschauen. In der CShell-Module finden sich eine Menge netter Strings, wie z.B:

CS_CH_GETUSERID_REQ

Die XRefs von IDA Pro führen auf eine Funktion, in der dieser String verwendet wird. Der interessante Teil beschränkt sich zunächst auf folgende Zeilen:

.text:0069D723                 call    memcpy
.text:0069D728                 mov     ecx, someGlobalManager
.text:0069D72E                 add     [ebp+var_C], esi
.text:0069D731                 add     dword_15BEF24, ebx
.text:0069D737                 mov     eax, [ecx]
.text:0069D739                 mov     eax, [eax+2D8h]
.text:0069D73F                 add     esp, 0Ch
.text:0069D742                 lea     edx, [ebp+Dst]
.text:0069D748                 push    edx
.text:0069D749                 call    eax
.text:0069D74B                 mov     eax, GlobalILTClient
.text:0069D750                 add     dword_15BEF24, ebx
.text:0069D756                 mov     ecx, [eax]
.text:0069D758                 mov     edx, [ecx+18h]
.text:0069D75B                 push    offset aCs_ch_getuseri ; "CS_CH_GETUSERID_REQ"
.text:0069D760                 push    eax             ; Args
.text:0069D761                 call    edx

Wie unschwer zu erkennen ist, wird ein statischer Zeiger geladen und dessen Pointer in EAX gespeichert. Dort wird im Anschluss die Adresse einer virtuellen Funktion geladen (ECX + 2D8h) und diese mit einem Argument in EDX aufgerufen. Wie sich später herrausstellt ist in EDX das eigentliche Packet gespeichert. Im Anschluss wird nochmals eine virtuelle Funktion geladen und aufgerufen, dieses mal allerdings zu Logzwecken. Wie können wir uns das zu nutze machen? Wir hooken beide Funktionen und loggen so alle Packete die Packetnamen in ein Logfile. Und das alles, bevor irgendetwas verschlüsselt wird . 😉

Continue Reading

0

Blog wieder Online

Nach einigen Problemen mit der Domain ist der Blog für ein weiteres Jahr online!

Während der Downtime war ich aber nicht faul, sondern habe weiter interessante Artikel für den Blog vorbereitet. Freut euch auf ein Keygen-Me, weitere Posts zu Apex und Wolfteam und natürlich auch zum Bitcoin-Cashier 😉

Greez

0

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.

Continue Reading

0

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. Continue Reading

0

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.

Continue Reading

0

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: [Download nicht gefunden.]

Greez

0

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.

Keygen2

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 – 0x30 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.

Continue Reading

0

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.

Keygenme_Title

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:

Keygenme_Stack

Und die Instructions zu denen dieser RETURN führt:

Keygenme_MSG

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.

Continue Reading

0

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 😀
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 😀 Bin schon gespannt, wann er auf Platz 1 der Ranglisten landet.

Greez Easy

0

Seiten:1234567...13