PC Texthacking-Tutorial I
1. Einführung
Hi! Mit diesem Tutorial versuche ich euch ganz simples Text-Hacking für PC-Spiele beizubringen. Einmal die
simple Variante mit dem Resource-Hacker und dann geht es einmal Hardcore ran.
Ihr braucht hierfür keine Assembler-Kenntnisse auch wenn sie empfohlen werden.
Als Beispielprojekt für dieses Tutorial hab ich in der Anlage ein kleines Projekt welches wir im laufe dieses
Tutorials übersetzen werden. Wir wollen das Projekt auf Deutsch übersetzen.
Zunächst brauchen wir dafür 2 kleine Programme die zum Glück Freeware sind.
Downloaded also folgende Programme:
Und downloaded das Projekt hier, an dem wir alles testen:
"Guten Morgen" Projekt
Alle Programme müssen einfach nur irgendwohin entpackt werden.
Vielleicht einen kleinen Blick auf das zu hackende Projekt werfen.
Schönes Programm (was keiner braucht) aber wir wollen es komplett übersetzen.
Lasst uns also loslegen!
2. Das Dialog editieren
Fangen wir mit dem einfachen Teil an.
Startet den Resource Hacker und laded über File/Open das Projekt "Tutorial1.exe".
Das ganze sollte jetzt so aussehen:
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/rh01.jpg]
Klickt nun auf das Plus vor dem Dialog. In der Liste erscheint ein 101. Das ist das Dialog
mit der Nummer 101. Da wir keine anderen haben öffnen wir also auch diesen "Ordner" mit
dem Plus davor. Wählt nun die neue Nummer aus die erscheinen sollte.
Es öffnet sich nun folgender Code:
101 DIALOG 0, 0, 178, 65
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Good morning greets"
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
FONT 8, "MS Sans Serif"
{
CONTROL "Greets", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 67, 44, 50, 14
CONTROL "Quit", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 121, 44, 50, 14
CONTROL "Enter your name:", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 13, 117, 8
CONTROL "", 1000, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 13, 25, 152, 12
}
Alles anzeigen
Alle Texte zwischen den Anführungsstrichen kann man nun ändern. Ändern wir als die Daten so:
"Good morning greets" - "Schönen guten Morgen!"
"Greets" - "Grüße"
"Quit" - "Beenden"
"Enter your name:" - "Geben Sie Ihren Namen ein:"
Klickt danach auf "Compile Script", sonst werden die Daten nicht übernommen. Die Vorschau
sollte sich nun angepasst haben und so aussehen:
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/rh02.jpg]
Speichert das Programm mit File/Save As unter "Tutorial1b.exe". Wenn wir das Projekt jetzt starten
haben wir ja schon fast alles Deutsch. Aber nicht zu früh freuen. Jetzt geht es nämlich an die komplizierteren
Sachen.
Den Ressource Hacker brauchen wir für dieses Projekt nun nicht mehr.
3. Die MessageBox
Theoretisch ginge dieser Part jetzt auch mit einem HEX-Editor. Aber für mögl. folgende Tutorials sollte man
doch schonmal was mit dem OllyDBG gemacht haben.
Startet den ollydbg. Öffnet damit nun die "Tutorial1b.exe". Jetzt bloss keinen Schock kriegen. Ihr werdet jetzt
nämlich massig Assembler Code kriegen. Aber ich habe ja gesagt - wir brauchen für dieses Tutorial keine
Assembler-Kenntnisse.
Der Schock sollte etwa so aussehen
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/od01.jpg]
Macht mal irgendwo ein Rechtsklick auf den linken, oberen Bereich. Klickt auf Search for und dann
auf All referenced text strings.
Es sollte sich folgendes Fenster öffnen:
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/od02.jpg]
Siehe da! Unsere Texte die wir suchen sind sogar auch mit aufgelistet. Ein Doppelklick auf "Good morning :)"
führt uns im CPU Fenster zur gesuchten Stelle. An dieser Stelle im Code wird nun ein Zugriff auf den Text
gemacht. Es ist nur interessant zu wissen wie.
Die markierte Zeile sollte so aussehen. Nur die Nummer hinten kann anders sein:
Ein Rechtsklick auf diese Zeile. Wir möchten nun versuchen den Text im Speicher wieder zu finden.
Wir wissen nur, dass der Text an der Stelle 40603C im Speicher ist. Da wir aber nicht über 10 Umwege
diese Stelle erst raussuchen wollen halt der Rechtsklick. Wir gehen auf Follow in Dump und dann
auf Immediate constant.
In dem Fenster unten, links sind wir nun an der Stelle, an der "Good morning :)" steht:
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/od03.jpg]
Mit der Maus (gedrückte Maustaste) markieren wir nun den kompletten Text mit der darauffolgenden 00.
Somit also die ersten, oberen 2 Zeilen in dem HEX-"Editor". Danach einmal mit Rechtsklick darauf klicken
und auf Binary -> Edit gehen.
Klickt auf das obere Eingabefenster in dem neuen Dialog, dass sich öffnen sollte. Überschreibt den Text
mit "Guten Morgen!".
Was fällt auf? Unser Text ist kürzer als der orginal Text. Wer ein wenig Erfahrung in der C++ Programmierung hat,
weiss, dass es ein sogenanntes 0-Byte gibt. Dieses ist die 00 die wir unten im HEX Fenster sehen.
Jeder Zahlen/Zeichenblock unten im HEX-Feld steht für ein Buchstabe oben bei ASCII. Die 00 ganz am Ende
ist ein Zeichen, dass das Ende des Textes angibt. Wenn wir also den Doppelpunkt ( 3A ) mit einer 00 Ersetzen,
haben wir auch da unser Ende Zeichen. Am besten füllt man gleich alles bis zum Ende mit Nullen auf.
Das ist nicht leicht zu erklären aber seht einfach auf dem Bild wie es aussehen sollte:
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/od04.jpg]
Jetzt ist der Zeitpunkt gekommen das alles zu testen. Eins muss ich im voraus erwähnen. Das Programm besser
NICHT beenden. Zum testen einfach oben auf den blauen Play-Knopf drücken (der Pfeil, der nach rechts zeigt) oder
einfach F9 drücken. Das Programm öffnet sich meistens im Hintergrund
Auch wenn wir jetzt weiter machen, das Programm nicht beenden!
Jetzt ist alles soweit fertig. Schön, oder?
Aber wir müssen noch speichern. Dazu wechseln wir wieder (ohne unser Programm zu beenden) zum OllyDBG.
Dann klicken wir mit dem Rechtsklick auf unseren geänderten Text im "Hex dump" Fenster (die Markierung) und dann
auf "Copy to executable".
Es öffnet sich ein neues Fenster mit einem HEX Code.
Dieses kann aber sofort wieder geschlossen werden. Dann kommt die Frage ob du speichern
möchtest. Natürlich möchten wir das und zwar auf "Tutorial1c.exe". Jetzt können wir OllyDBG schließen und die
neue EXE Datei öffnen.
4. EXE Datei erweitern
Irgendwie finde ich dieses starre "Hi /Name/!" sehr unfreundlich, dafür, dass er uns einen schönen guten Morgen
wünscht. Das Problem ist aber, dass wir Texte bislang nur verkürzen können und nicht verlängern weil dazu nicht
genug Platz in der EXE Datei ist.
Wer ein wenig Ahnung vom GBA Texthacking hat, weiss bestimmt was ich mit umpointen meine. Vorhin bei dem
"good morning" hatten wir folgende Zeile:
0040603C ist dabei die HEX-Adresse in der EXE Datei. Die Stelle in der EXE-Datei, an der der Text steht.
Würden wir die Zahl nun um eins erhöhen, also 0040603D, dann würden wir nur noch "uten Morgen!" haben,
weil die Adresse eins zurück versetzt wurde.
Das Problem, dass sich nun stellt ist: Wohin mit dem neuen Text? Wo haben wir Platz für weitere Texte?
Man kann nun Glück haben und irgendwo eine freie Stelle finden, allerdings möchten wir uns nicht so
einschränken.
Unser magisches Tool heißt "LordPE". Eines von sicher mehreren Programmen, die neue Sektionen an die EXE
anhängen können. Mehr dazu gleich.
Hier gibt es das nette Tool
http://mitglied.lycos.de/yoda2k/LordPE/info.htm
Dieses wollen wir zugleich direkt auch mal starten. Als erstes klicken wir auf "PE Editor", wir wollen
schließlich den PE-Header von der EXE bearbeiten. Da stehen nämlich die Sektionen drin. Es sollte sich
ein "Öffnen-Dialog" öffnen in dem ihr die "Tutorial1c.exe" öffnet. Die ganzen Werte, die nun erscheinen
sollen uns erstmal nicht stören. Wir klicken einfach auf "Sections", da wir es auf diese abgesehen haben.
Nun erscheint eine Liste aller Sektionen, die es in dieser EXE Datei gibt:
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/pe01.jpg]
Alles davon müssen wir nicht kennen. Uns reicht wenn wir wissen:
.TEXT ist der "Quellcode". Dort steht der ausführbare Assembler Quellcode.
.RDATA beinhaltet konstante Texte, etc.
.DATA beinhaltet Variablenplatzhalter.
.RSRC beinhaltet Ressourcen. (Icon, Dialog, etc.)
Wir wollen eine neue .RDATA Sektion einfügen. Rechtsklick auf irgendeine Zeile in der Liste und dann
"add section header" auswählen. Es sollte eine neue Zeile erscheinen:
Rechtsklick auf diese neue Zeile und "edit section header..." auswählen.
Es öffnet sich ein neues Dialog. Als Namen können wir eigentlich eintragen, was wir wollen. Sollte nur
kurz sein und am besten mit einem Punkt beginnen. (Einfach um sich an Standarts zu halten )
Ich hab meine mal ".odata" für "own data" genannt. Die VirtualAddress und den RawOffset lassen wir so,
wie er ist. Das ist einmal die Position später im Speicher und einmal die Position hier in der EXE Datei.
Bei VirtualSize und RawSize tragen wir nun mal 00000800 ein, also 2048 im Dezimalsystem. Reicht auf jeden
Fall für unsere neue Nachricht. Nun noch ein Klick auf die drei Punkte hinter Flags.
Hier kann man nun Eigenschaften festlegen, die diese Sektion haben soll. Wir brauchen eine Sektion,
die nur "Readable" ist und nicht "Contains executable code" hat.
Ebenso brauch "Contains uninitialized data" keinen Haken.
Rechts im Kästchen "Current value" sollte nun 40000040 stehen.
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/pe02.jpg]
Dann OK und OK. Jetzt sind wir wieder bei der Liste.
Eigentlich könnte man denken, dass wir fertig sind, sind wir aber noch nicht!
Wir müssen an unsere EXE Datei nämlich noch Bytes anhängen, die wir für unsere neue Sektion benutzen
können. Ohne diese Bytes könnten wir schließlich keine Nachrichten speichern.
Dazu reicht allerdings ein Rechtsklick auf unsere neue Zeile und dann "truncate at end of section".
Jetzt können wir das Fenster schließen mit den Sektionen und in dem darunterliegendem Dialog auf
"SAVE" klicken. Danach nur eben noch auf "OK" und "EXIT".
Und schon haben wir das auch erledigt.
5. Restarbeit
Jetzt öffnen wir die Tutorial1c.exe wieder mit OllyDbg. Wir wollen nun einen neuen Text in unsere ebenso
neue Sektion schreiben. Dazu klicken wir einfach auf das "M" oben mit dem türkisen Hintergrund.
Es öffnet sich ein "Memory map" Dialog, in dem wir unsere neue Sektion sehen sollten.
Einmal Doppelklick darauf und es öffnet sich ein HEX Editor. Markiert einen größeren Abschnitt und macht
Rechtsklick "Binary" -> "Edit"
[Blockierte Grafik: http://www.devil-studios.de/profeich/pchdemo/od05.jpg]
Jetzt müssen wir uns kurz zurück errinern. Die Nachricht lautete "Hi %s.". Also muss %s der Platzhalter
für den Namen sein! Wunderbar! Also lasset uns eine neue Nachricht schreiben mit %s als Platzhalter:
"Hallo %s! Ich wünsche dir einen schönen guten Morgen!" als Beispiel.
Wobei ich das Leerzeichen hinter dem Aufrufezeichen noch durch HEX 0A ausgetauscht habe für einen
Zeilenumbruch.
Merkt euch unbedingt die Adresse, an der der Text steht. Sollte bei uns eigentlich immer 00409000 sein.
Nun wiederholen wir nochmal den Part mit dem Suchen nach allen Texten. Nur diesmal ein Doppelklick
auf "Hi %s."
Die markierte Zeile sollte nun etwa so aussehen:
Rechtsklick darauf und "Assemble" auswählen.
Überschreibt nun die Adresse 0040604C mit der neuen Adresse 00409000 und drückt auf "Assemble"
und danach auf "Cancel".
Nun probieren wir das Programm erstmal wieder aus. Dazu einmal auf den blauen "Play"-Knopf drücken.
Denkt dran: Das Programm nicht beenden!
Nachdem wir unseren Namen eingegeben haben werden wir nun freundlichst begrüßt!
Aber jetzt müssen wir noch speichern. Dazu wechseln wir wieder zu OllyDbg.
Rechtsklick auf das Fenster und "Copy to executable" -> "All modifications".
In dem Fenster das sich dann öffnet einmal auf "COPY ALL" klicken.
Aber Achtung! Er hat sich nicht wirklich alles gespeichert. Rechtsklick auf unsere geänderte Zeile
und "Follow in Dump" -> "Immediate constant". Unten in dem HEX-Editor sollte nun unser neuer Text
stehen. Markiert den und macht dann einen Rechtsklick drauf und wählt auch dort
"Copy to executable" aus.
Jetzt dürft ihr das Fenster mit dem HEX Code, welches erscheint schließen. Auf die Frage, ob
wir es unter einem anderen Dateinamen speichern wollen wählen wir "JA" und speichern das
ganze als "Tutorial1d.exe".
Beende nun OllyDbg und starte die Tutorial1d.exe Datei. Mal schauen ob es klappt.
Und nun sollte es eigentlich schon klappen, sonst habt ihr was falsch gemacht oder ich zu schlecht
erklärt.
6. Next time
Falls es ein Texthacking PC Tutorial 2 geben sollte, werde ich ein wenig Assembler Kenntnisse
voraussetzen müssen. Aber mal schauen
Feedback, sowohl negativ (wohl eher ^^") als auch positiv ist sicherlich erwünscht!