Seite 1 von 1

S2HackIt Sourcecode offengelegt (komplexes Gamemodding)

Verfasst: 24.02.2009 18:03
von Thorium
Wie ein paar vieleicht wissen, lege ich gerne die Sourcecodes von Projekten, welche ich aufgegeben habe offen. Ganz einfach damit andere sich davon inspirieren lassen können oder etwas lernen können.

Der Source, welchen ich nun offenlege, sollte eigentlich nie veröffentlicht werden. Aber da das Spiel nicht der Überrenner geworden ist, der es hätte werden sollen, ist es auch wurscht. Ich sehe keinen Grund den Source weiter unter Verschluß zu halten. Und da hier doch ab und zu nach Gamemodding, Gametools gefragt wird macht sich der Source hier sicher ganz gut.

Zuerstmal eine kleine Einleitung was das für ein Tool ist. Es ist ein Cheating-Tool. Es ist kein Trainer oder fertiger Hack den man nur anschmeissen braucht. Viel mehr ist es ein Tool welches beim Hacken von "Sacred 2: Fallen Angel" behilflich ist. Ich habe das Tool mit Authorisation der Testleitung von Sacred 2 entwickelt und es wurde zum Test des Anti-Cheatings eingesetzt. Das Tool funktioniert mit jedem Build egal ob Beta, Final oder sogar Demo. Soweit ich weis wurde bis jetzt keine Detection in Sacred 2 eingebaut, die S2HackIt erkennt. Aber das können die Devs sehr leicht tun. S2HackIt tarnt sich nicht. Also nicht nutzen um tatsächlich zu versuchen Sacred 2 zu hacken. Ansonsten werden eure Accounts sicher früher oder später gebannt.

Der Source ist deswegen interessant, weil er einige Techniken und Kniffe zeigt, die man praktisch in jedem Spiel ähnlich einsetzen kann. Und das nicht nur zum cheaten.

Also was tut das Tool?
Das eigentliche Tool ist eine DLL, welche in den Sacred 2 Prozess injiziert wird. Ein spezieller Injector mit Source liegt bei. Sobald die DLL injiziert ist, beginnt sie sich in das Spiel einzuklinken und stellt Funktionen zur Verfügung, welche man über die spielinterne Konsole aufrufen kann.

Hier mal die alte Beschreibung:

Was ist S2HackIt?
S2HackIt ist in erster Linie ein Programm, welches sich in den Prozess von Sacred 2 einbettet und dort dann für weitere Programme (Plug-ins) Zugriff auf die In-Game Konsole ermöglicht. Zudem bietet es das abarbeiten von Batch-Dateien (Stapelverarbeitung).
Also die eigentliche Arbeit wird von den Plug-ins verrichtet. S2HackIt bietet lediglich alles was nötig ist um so ein Plug-in ohne großen Aufwand zu realisieren.

Installation von S2HackIt
Installiert wird es, indem der Ordner "S2HackIt" aus der .zip in den "system"-Ordner im Sacred 2 Ordner entpackt wird.

Starten von S2HackIt
  • Sacred 2 Beta starten
  • warten bis Sacred 2 komplett gestartet ist
  • "Injector.exe" im S2HackIt-Ordner ausführen
Wenn man nun die Konsole in S2 öffnet sollte es so aussehen:
http://www.gametreasure.de/bilder/s2hackit002.jpg

Verwenden von S2HackIt
S2HackIt klinkt sich nach dem injizieren in die Konsole von S2 ein. Alle Kommandos, welche S2HackIt ausführen kann, können nun über die Konsole von S2 eingegeben werden. Dabei wird die Groß-Kleinschreibung ignoriert.

Die Kommandos

Eject
Entläd S2HackIt wieder.

Freeze
Friert S2 ein.
Technisch gesehen werden dabei alle Threads bis auf den von S2HackIt angehalten. Dieses Kommando sollte nur in Batch-Dateien verwendet werden, da die Konsole logischerweise nach einem Freeze nicht mehr verwendbar ist.

UnFreeze
Lässt S2 wieder weiterlaufen.
Dieses Kommando wird auch durch drücken der F12-Taste ausgeführt.

Starten von Batch-Dateien
Einfach den Namen der Batch ohne Dateierweiterung eingeben.

Batch-Dateien
Einfache Textdateien mit der Dateierendung .s2hb.
Sie können Kommandos vom S2HackIt-Core, Plug-ins und Aufrufe anderer Batch-Dateien enthalten.

MemPatcher Plug-in
Ein Plug-in wird bereits mitgeliefert. Es bietet Möglichkeiten zur Speichermanipulation an.

Im folgenden werden die Kommandos des MemPatchers erläutert:

Patch Adresse Daten
Überschreibt den Speicher an der angegebenen Addresse mit den angegebenen Daten.
Adresse und Daten müssen in Hexadezimal angegeben werden.

PatchPtr Pointer_Adresse relative_Adresse Daten
Überschreibt den Speicher auf den der angegebene Pointer zeigt mit den angegebenen Daten.
Relative_Adresse gibt die Adresse des zu überschreibenden Speichers relativ zum Pointer an.
Auch hier muss alles in Hexadezimal angegeben werden.

PatchMod Modul_Name relative_Adresse Daten
Überschreibt den Speicher im angebenen Modul.
Relative_Adresse gibt die Adresse des zu überschreibenden Speichers relativ zum Modul an.
Modul_Name wird als Zeichenkette angegeben z.B.: s2core.dll
Der Rest in Hexadezimal.

Später hatte ich dann noch das NetHack Plug-in entwickelt, welches einen Packetsniffer anbietet der eingehende uns ausgehende Packete loggt und auch eine Filterung der Packete war geplant, habe ich aber nicht mehr fertig bekommen, bevor ich aus dem Betatest ausgestiegen bin.

Code: Alles auswählen

/--------\
| NetLog |
\--------/
Startet und stoppt das Logging.

/----------------\
| NetShow Log-ID |
\----------------/
Gibt den Hexdump des Packets mit der angegebenen Log-ID aus.

/----------\
| NetFltEx |
\----------/
Setzt den Filtermodus auf Exclude. (Standart)

/----------\
| NetFltIn |
\----------/
Setzt den Filtermodus auf Include.

/--------------\
| NetReLoadFlt |
\--------------/
Läd alle Filter neu.
Nützlich falls Filter zur Laufzeit mit einem Texteditor erstellt oder geändert wurden.

/----------------------\
| NetActFlt Filtername |
\----------------------/
Aktiviert einen Filter.
Filtername ist der Dateiname des Filters ohne Dateierweiterung.

/------------------------\
| NetDeActFlt Filtername |
\------------------------/
Deaktiviert einen Filter.
Filtername ist der Dateiname des Filters ohne Dateierweiterung.

/-----------------------\
| NetShowFlt Filtername |
\-----------------------/
Noch nicht implementiert!

Zeigt den Filter in der Konsole an.

/------------\
| NetListFlt |
\------------/
Listet alle geladenen Filter auf mit ihrem Status auf.

/----------------------------------------\
| NetAddFlt Log-ID Byteanzahl Filtername |
\----------------------------------------/
Noch nicht implementiert!

Erstellt aus einem geloggten Packet einen Filter.
Byteanzahl ist die Anzahl der Bytes von vorne gezählt, die in den Filter übertragen werden sollen.
Geeignet um sehr schnell simple Filter zu erstellen.

/-------------------------\
| NetCreateFlt Filtername |
\-------------------------/
Noch nicht implementiert!

Öffnet Notepad zum erstellen komplexer Filter.
Nach Schließen von Notepad wird der Filter automatisch geladen.

/----------------------\
| NetDelFlt Filtername |
\----------------------/
Noch nicht implementiert!

Löscht einen Filter.

Filter werden generell komplett in Hexadezimal erstellt.

Ein Filter beginnt mit dem Header, dieser gibt aufschluß über die Version des Filterstandarts der verwendet wird. Dadurch kann NetHack erkennen ob es den Filter verarbeiten kann oder nicht.

------------------
NetHack Filter
Version: 1
Type: Check/Edit
Mode: Raw/Event
Direction: In/Out/Any
IP: Any
Port: Any
------------------

Im Augenblick wird nur der Raw-Modus unterstützt, dieser erlaubt direkte Filterung der Rohdaten des Packets ohne vorherige Verarbeitung und/oder Aufschlüßlung durch NetHack. Später soll noch ein Event-Modus implementiert werden. In diesem werden die Packete in Events aufgeteilt und so können einzelne Events gefiltert werden.

Aufbaue der Bytefilterung:

Jedes Byte wird durch 3 Zeichen im Filter behandelt. Das erste Zeichen stellt einen Vergleichsoperator dar, die darauffolgenden 2 Bytes stellen den Hexwert dar mit dem verglichen wird.

Vergleichsoperatoren:
= Packet Filtern, wenn Byte in Packet gleich dem Byte im Filter ist.
! Packet Filtern, wenn Byte in Packet ungleich dem Byte im Filter ist.
> Packet Filtern, wenn Byte in Packet größer ist als Byte im Filter.
< Packet Filtern, wenn Byte in Packet kleiner ist als Byte im Filter.
? Gibt an das kein Vergleich durchgeführt werden kann, da dieses Byte im Packet ignoriert werden soll.

Ein Beispiel:

-----------------------------------
NetHack Log Filter
Version: 1
Type: Check
Mode: Raw
Direction: In
IP: Any
Port: Any

Pattern
=EF =FF =FF =CD ??? ??? ??? ??? >04 ^??
-----------------------------------

NetHack wandelt Filter intern in Bytecode um, um Speicher zu sparen und die Performance des Filtervorgangs zu erhöhen.

Ein Sonderfall ist ^??, es gibt an das alle nachfolgenden Bytes im Packet ignoriert werden sollen. Ist es nicht als letztes im Filter angegeben, so wird das Packet nur gefiltert wenn die Packetgröße mit der Filtergröße übereinstimmt.
Dem Download liegen die Sources des Cores, Injectors, MemPatchers und NetHacks bei. Sowie als kompilierte und lauffähige Version.

S2HackIt 1.02 Source+Binary+Plug-ins (50kb)

Und so sieht das Tool in Aktion aus:
http://www.gametreasure.de/bilder/s2hackit03.jpg

Verfasst: 24.02.2009 18:09
von Milchshake
Sehr interessant, wollte schon immer einmal wissen wie das funktioniert!
Werde es mir nachher mal anschauen.