Archive for Dez. 2013

Siedler 3 - 2 lustige Bilder für Zwischendurch

Manchmal kann man es einfach nicht lassen: Man findet eine nette Funktion und muss sie irgendwie Ausnutzen. Aber keine Sorge, die hier gezeigte Funktion zum Items Spawnen sorgt im Multiplayer für eine Desynchronisation ;)

Zunächst war da die Funktion, um das GoldItem zu spawnen.

S3_Hack2

Auf der Suche nach weiteren ItemIDs habe ich mal in einer Loop alle Items erstellen lassen. Da ich die Taste etwas zu lange gedrückt habe ist dieses Bild entstanden :D

S3_Hack1

Und nunja, damit bliebt mir nur noch zu Sagen:

Math_XMas

Greez

17 people like this post.

Siedler 3 - Draw Hook und GDI

Mit dem Wissen über COM Objekte aus dem letzen Beitrag gerüstet, sind wir nun in der Lage, Code vor bzw hinter die jeweiligen DirectX Funktionsaufrufe zu packen. DirectX 8 nutzt zum Zeichnen sog. Surfaces, also eine Fläche, auf die gezeichnet wird. Im normalfall wird jeweils das Backbuffer Surface beschrieben und im Anschluss mit dem primären Surface ausgetauscht (Flip). Das macht Siedler 3 im Hintergrund für uns, daher müssen wir uns nicht darum kümmern.

Wir könnten einerseits über die Funktion “Lock” und “Unlock” direkten Zugriff auf das Surface bekommen, um dort einzelne Pixel zu setzen. Da dieses aber nicht so effektiv ist, gibt es andere Wege. Man könnte die sog. “Blit” (bit block transfer) Funktion aufrufen, um Teile aus einer Grafik in das Surface zu schreiben. So wird das zum Beispiel mit den Menuelementen, oder auch mit Sprite-Grafiken gemacht. Da wir aber zunächst nur Text ausgeben wollen, bietet uns DirectX 8 ein nettes Feature: GDI.

S3_GDI

GDI steht für Graphics Device Interface und bietet uns Funktionen zum Zeichnen, wie wir es z.B. von dem .NET Graphics Namespace gewöhnt sind. Über die Funktion “GetDC” erhalten wir einen sog. “Device Context”, welcher einem Zeichenhandle entspricht. Mit diesem können wir nun alle Funktionen aufrufen, die ein solches Handle entgegen nehmen, z.B. FillRect oder auch TextOutA/W. Zum simplen Zeichnen nehmen wir also folgenden Code:

// In einer Init Methode
LPLOGFONT fontArial = new LOGFONT();
 
ZeroMemory(this->fontArial, sizeof(this->fontArial)); // Wir setzen lieber nochmal den Speicher auf 0
wcscpy(this->fontArial->lfFaceName, L"Arial"); // Wir kopieren den Fontnamen den wir haben wollen rein
this->fontArial->lfQuality = ANTIALIASED_QUALITY; // Und setzen noch ein bisschen Anti Analising
 
// In der Methode zum Textzeichen
HFONT hFont = CreateFontIndirect(font);		// Eine "richtige" Font aus unserer LOGFONT
SelectObject(this->currentHdc, hFont);		// GDIHandle, nutze für das nächste diese Font
SetBkMode(this->currentHdc, TRANSPARENT);	// Mach den Background Transparent, sonst gibts Rahmen
SetTextColor(this->currentHdc, color);		// Setze die Color (color ist eine COLORREF struct)
TextOutA(this->currentHdc, x,y, pText, strlen(pText));	// Und schreibe den Spass in unser Surface

Weiterlesen

9 people like this post.

Siedler 3 - COM Objekte, DirectDraw und Fenstermodus

Grau, teurer Freund, ist alle Theorie, und Grün des Lebens goldner Baum. (Mephisto)

Diese Thorie wird, so leid es mir auch tut, den gesammten folgenden Artikel durchziehen. Man braucht ein paar Grundlagen, auf die man später zurückgreifen kann, wenn es richtig spassig wird. Diese Grundlagen sind zu vergleichen mit einem Bauplan: Woher sollten wir wissen, an welchen Schrauben wir drehen müssen und wie diese Aussehen, um ein bestimmtes Ziel zu erreichen?

Fangen wir mit den COM-Objekten, bzw genauer mit Interfaces und ihren “Virtual Tables” (VTables) an. Ein Objekt das von einem Interface erbt, ist gezwungen, die im Interface definierten Methoden zu implementieren (die Methoden zu “überladen”). Dabei kommen sog. Funktionszeiger zum Einsatz, die auf eine Funktionsaddresse zeigen. Von dieser Funktion ist der Prototype bekannt, also wird diese Adresse angesprungen, nachdem die bekannten Argumente auf den Stack gepushed wurden. COM-Interfaces sind spezielle Interfaces, die alle von IUnknown erben. Konkret bedeutet das, dass jedes COM-Objekt die 3 in IUnknown deklarierten Methoden “QueryInterface”, “AddRef” und “Release” implementiert. QueryInterface erstellt ein Interface, das einer IID entspricht. Im Post CLRHosting Reloaded wurde z.B. ein Interface vom Typ “IID_CLRRuntimeHost” erstellt, das uns wiederrum bestimmte Funktionen bereitgestellt hat. AddRef erhöht den Referenzcount, Release erniedrigt den Referenzcount und löscht das Objekt, falls dieser Null wird. Wichtig ist hier zu erwähnen, dass die VTable eines Interfaces, wenn es erstellt und gelöscht wurde, sich noch immer an der selben Stelle im Speicher befindet. In OllyDbg sieht ein solches Interface folgendermaßen aus:

S3_Interface1

Hier haben ein direkten Call eines Interfaces. Es handelt sich dabei (wie bei allen Interface Calls) um die sog. Thiscall-Convention, heißt im Register ECX wird ein THIS_POINTER übergeben, sonst werden die anderen Argumente normal auf den Stack gepushed. Nun wird CALL [ECX+80h] aufgerufen, was einem Funktionsaufruf in der VTable entspricht. Genauer gesagt die Funktion (80h / 4), also 20h oder 32. Im Dump-Window habe ich hier ECX geladen, was direkt der VTable entspricht. Die ersten 3 markierten Funktionen Funktionen ensprechen den Funktionen aus IUnknown (QueryInterface, AddRef, Release), in Orange ist die aufgerufene Funktion “Unlock” markiert. Schauen wir doch mal in die ddraw.h, in welcher alle unsere Interfaces deklariert sind.

Weiterlesen

11 people like this post.

Neue Reverse Engineering Serie - Siedler 3

Wer kennt es nicht? Das Kultspiel Siedler 3, das sogar noch heutzutage mein und so manch anderes Spielerherz höher schlagen lässt. Aber keine Sorge, in dieser Serie wird kein Hack entwickelt, dafür wäre das Spiel zu schade. Es geht also um etwas anderers:

Der Publisher Ubisoft, welcher Blue Byte im Jahre 2001 aufkaufte, hat vor einiger Zeit die öffentliche Lobby (siedler3svr.bluebyte.de:3344) abgeschaltet. So ist ein Online Matchmaking umständlich nur noch über den LAN Modus und diverser Tricks zu erreichen. Über das Back2Hack Board bekam ich Kontakt zu einem Programmierer, welcher das Matchmaking wieder leichter und komfortabler machen will. Das optimale Ziel wäre es, die Lobby wiederherzustellen, aber die Matchmaking Logik über seine Server laufen zu lassen.

Nach ein wenig Kontakt beschlossen wir, ein solches Projekt in Angriff zu nehmen. Dabei geht es im ersten Schritt darum, das Matchmaking über die Spielesuche im LAN-Menu zu entwickeln. Der selbst programmierte Server empfängt alle neu gehosteten Spiele und sendet diese an andere Clients, die gerade Spiele suchen. Dabei sendet der Server Packete, wie sie der Siedler 3 Client/Host im LAN schicken würde.

S3_Lobby

Das alles klingt leichter gesagt als getan, denn Siedler 3 legt einem einige Stolpersteine, wenn nicht sogar ziemlich große Felsbrocken in den Weg. So ist das Spiel ohne Fenstermodus erschienen, was dank Auflösung von max. 800 x 600 Debugging unmöglich macht. Des weiteren wird das alte DirectDraw verwendet, was ein Segen und Fluch zugleich ist. Der DirectPlay Support ist in Windows Vista nahezu vollständig entfernt worden, was Probleme beim Erzeugen von gewrappen Interfaces gibt. Und als ob das nicht alles schon schwer genug wäre, so ist der Programmierstil der 2000der Jahre auch nicht der strukturierteste.

In der folgenden Serie wird es also darum gehen, Siedler 3 unter die Lupe zu nehmen und geschickt ein paar Hooks zu platzieren, die uns im Ende eine funktionierende Lobby ermöglichen. Ob es funktioniert weiß ich noch nicht, allerdings bin ich durch die bisherigen Ergebnisse ziemlich zuversichtlich. Zudem bekommt ihr einen Eindruck, wie Gruppen wie z.B Techogods arbeiteten, wenn sie Spiele Analysieren und Modifizieren. Des weiteren werden ein Informationen zu DirectDraw, GDI und natürlich Netzwerktechnik vermittelt.

Der nächste Artikel wird sich mit COM Objekten, Direct Draw und dem Fenstermodus befassen. Je nach Länge des Posts wird noch der DircetDraw Hook vorgestellt. Und bis dahin fröhliches Siedeln!

Greez

 

8 people like this post.

System.Reflection.Emit und ein altbewährtes Produkt

Hallo allerseits !

Bevor ich zu meinem ersten Beitrag hier komme, stelle ich mich mal kurz vor.
Mein Nickname aus der Szene ist WD40, ich war/bin Administrator von secunet.cc, welches aktuell nicht zu erreichen ist.
Meine bevorzugte Sprache in der Programmierung ist C#, da ich damit täglich arbeite und somit auch die größten Kentnisse in dieser Sprache vorweisen kann.
Grundlegend interessieren mich aber alle Sprachen ( mal abgesehen von den typischen Websprachen).

Kommen wir zum eigentlichen Thema: System.Reflection.Emit.
Emit ist ein Namensraum, welcher seit .Net 2.0 implementiert ist.
Hier eine kleine Definition aus der MSDN:

Der System.Reflection.Emit-Namespace enthält Klassen, die es einem Compiler oder Tool ermöglichen, Metadaten und MILS (Microsoft Intermediate Language) auszugeben sowie optional eine PE-Datei auf einem Datenträger zu generieren. Die wichtigsten Clients dieser Klassen sind Skriptmodule und Compiler.

(Link: http://msdn.microsoft.com/de-de/library/system.reflection.emit.aspx ) Weiterlesen

4 people like this post.

And the winner is …

Die Umfrage ist seid gestern Abend geschlossen und heute wurden die Ergbenisse in ein paar Grafiken zusammengefasst. Es wurden insgesammt 34 Umfragebögen komplett ausgefüllt, was ich doch beachtlich finde. Danke auf jeden Fall hierfür!

Sehr gefreut haben mich kleinen Nachrichten, die meinst gute Ideen und Themenvorschläge, aber auch Lob und Kritik enthielten. Ich weiß nicht, ob ich alles davon umsetzen kann, aber mein Gehirn sprudelt bereits wieder vor Ideen.

Erstaunlich fande ich auch, dass 9 der 34 Leute sich vorstellen können, am Blog etwas mitzugestalten/zu posten. Ich würde mich freuen, fremde Beiträge, in welcher Art auch immer, zu erhalten. Schreibt mir einfach eine Email (rechts verlinkt).

Die beliebsteste Kategorie ist .NET Reverse Engineering, gefolgt von Gamehacking, nativem RE und Programmierung in C#. Also quasi alles, was der Blog zu bieten hat :D Android RE und Programmierung sind exoten, sonst hat sich das Feld ziemlich verteilt. Überraschend fand ich das Interesse an Websecurity. Wenn mir da mal Themen über den Weg laufen, so bekommen diese auf jeden Fall einen Eintrag.

GraphKatgorien

Bei den weiteren Fragen, die man auf einer Skala von 1-10 bewerten sollte, ist ein ziemlich breites Spektrum zu sehen. Der Durchschnittswert ist jeweils unter dem Bild angegeben:

GraphFrage1

Durchschnitt: 6,00

Weiterlesen

7 people like this post.