Anwendungen/Spiele patchen?

Hi!
Ich will schon lange mal drauf haben bei kompilierten Spielen und Programmen soweit durchzusteigen, um kleinere Sachen verändern zu können. Soweit ich weiss werden ich da wohl um asm nicht herumkommen und bin das auch gerade etwas am lernen. Nun ist mir aber irgendwie gar nicht klar, wie ich vorgehe um zB ein einfaches Spiel etwas zu verändern.
Angenommen in einem Spiel steht unten ein Text. In diesen will ich nun die Uhrzeit mit einbauen. Jetzt würde ich denken, ich müsste zuerst mal in C oder ASM etwas coden was die Uhrzeit anzeigt, und den compilierten Code dann irgendwie an die richtige Stelle im Hexcode des Spiels fummeln. Vielleicht geht es aber auch anders!?
Ich habe Visual C++ und Borland TASM. Brauche ich noch einen disassembler oder einen Debugger oder so?
Und wie kriege ich raus an welcher Stelle im Spielcode ich was zu suchen habe.
Ich würde mich freuen wenn mir jemand der sich in sowas auskennt mal beschreiben könnte wie er vorgehen würde um mein Beispiel zu lösen.

Danke :)
 
Ja ASM ist da definitiv Pflicht aber das kann auch großen Spass machen.

Du hast das im Prinzip schon richtig erkannt.
Erstmal musst du die Stelle im ASM Code des Spieles finden, in der Text zusammengesetzt wird also z.B. in C printf(...). Dafür brauchst du einen Disassembler oder Debugger.

Wenn du die Stelle hast kannst du einen Call zuvor einbauen der deine Änderungen bewirkt. Der ruft dann deine Funktion auf. Die muss z.B. in einen alten NOP Block reingepatcht werden, da es sehr kompliziert wird wenn sich die Größe der Executable ändert.

Ich schlage dir mal einschlägige Seiten zu Reverse Code engeniring und Cracking vor.
 
Danke dir erstmal :)
So ganz ist mir noch nicht klar wie ich das einbaue. Müsste ich nicht eine Funktion für die Uhrzeit schreiben und dann nur diese compilieren? Denn ich brauch doch wirklich nur den Maschinencode einer Funktion, die als return die uhrzeit liefert oder?
Mit diesem Maschinencode überschreibe ich dann unbenutzen Code in der "SpielEXE"? Ohne das irgendwas kaputt geht!? Und dann müsste ich doch genau soviel "originaltext" ersetzen, wie der Aufruf der "zeitfunktion" brauch oder?
Also würde dann im Spiel zB stehen:
"Das ist eine Text" -> "Das is13:21xt"
weil der code printf(time()) in Maschinencode genau so viele Zeichen braucht?

Ich fänds nachwievor super wenn jemand mal Schrit für Schrit schreiben könnte wie er das machen würde :)
Achso und was müsste man denn machen wenn man die größe der Exe verändern will weil es nichts unbenutztes zu ersetzen gibt?
 
Gezwungenen Sleep einbauen?
wäre zumindest eine grobe Übersicht. Ansonsten:
Denn ich brauch doch wirklich nur den Maschinencode einer Funktion, die als return die uhrzeit liefert oder?
Es kommt auf den Compiler an, aber i.R wird das so nicht funktionieren, da der Code adressgebunden ist (wegen relativer Adressierung sind die Angaben/Calls nur im Programm gültig und müssen "außerhalb" per Hand angepasst werden)

Schau Dich einfach mal in der Crackme Section um. Daran lässt es sich schön üben, weil die Executables eben kleiner sind.
Da Du noch offenbar keine ASM Grundlagen und keine Erfahrung mit Debuggern hast, wäre es auch etwas kompliziert, alles unter einen Hut zu bringen ;)

PS: und Crackmes Lösen bringt wirklich etwas für die "Praxis" (im Gegensatz zu Hackits ;) )
 
Ok danke, dann werde ich mal anfangen mich damit zu beschäfftigen :)
Nur eine allgemeinere Frage noch..
Ich hab mal gehört jemand hat in ein "einfaches" singleplayer Spiel irgendwie das winsock protokoll reingebastelt und es dadurch multiplayer fähig gemacht. Die anderen Spieler werden zwar nur angezeigt und sind nicht wirklich im Spiel vertreten aber immerhin..
Würdet ihr sowas auch hinkriegen und geht das überhaupt? Ich finde das schon ziemlich krass, dann kann man ja pratkisch alles machen, solange das Original nicht zu komplex ist..
 
Klar ist das möglich. Man kann theoretisch jedes Programm direkt in Maschinencode schreiben, das ist nur etwas aufwändiger ;). Bevor man aber solche riesigen Patch-Aktionen startet, sollte man sich vorher überlegen, ob sich der Aufwand lohnt, oder ob komplett selbst schreiben nicht vielleicht sinnvoller/einfacher wäre.

Wenn man Spaß an Low-Level-Programmierung hat, kann man natürlich jedem Programm neue Funktionen beibringen, man lernt schließlich auch ne Menge dabei.

Mfg, Eydeet.
 
Mal ne blöde Frage:
Wie ist das denn bei C#-Assemblies oder Java-Exes? Denn da wird der Code ja nur "vorkompiliert", da gibt es ja noch den JIT-Compiler, der das dann zur Laufzeit "fixfertig" kompiliert. Muss bei solchen Assemblies auch in ASM geschrieben werden? Ich meine der Code steht im Assembly doch nicht als ASM (oder schon?, glaub nicht).

Danke für Eure Antworten!
 
In .Net gibt es den Reflection-Namespace, der bietet Möglichkeiten an, Code zu Laufzeit zu manipulieren. Ich habe mich damit aber noch nicht näher beschäftigt.

Du kannst aber die Assembly (damit ist in .Net die exe/dll gemeint) auch Disassemblieren und dann einen Patch auf den Code anwenden.

Beim Visual Studio liegt bereits ein Disassembler dabei (ILDAsm).
Alternativ gibt es auch den Reflector, der kann nicht nur IL-Assembler sondern auch C#/VB.Net ausgeben und Solutions für das VS erstellen.
 
Noch ein Hinweis: Es ist oft einfacher die ganze Funktionalität die man gerne hätte in eine Dll auszulagern, die Funktion zu exportieren und an der gewünschten Stelle im Programm nur den Dll-Aufruf einzufügen. Somit hat man weniger Platzprobleme und kann den Code zudem in jeder Sprache schreiben, mit der man Dll erzeugen kann.
 
Ich sage es nur mal, weil man wenn man deinen Post liest meint das du das anders vorhast:
Wenn du eine Funktion schreibst und versuchst diese per asm in eine bereits bestehende Exe einzubeuen, dann soltlest du vielleicht darauf achten das der gewuenschte Effekt als Nebeneffekt erreicht wird und nichtder einzige SInn einer Funktion ist.
mfg

sw33t


P.s.:Im Hexcode musst du gar nichts machen.
Es recht wenn du die Exe durch den Disassembler schickst ,an entsprechender stelle deine bereits kompellierte Funktion einfuegst und dann wieder assemblierst.
 
Original von sw33tlull4by
P.s.:Im Hexcode musst du gar nichts machen.
Es recht wenn du die Exe durch den Disassembler schickst ,an entsprechender stelle deine bereits kompellierte Funktion einfuegst und dann wieder assemblierst.

Ein Disassembler erzeugt nur selten wieder assemblierbaren Code. Es ist oft mehr Aufwand(meine Erfahrung) den Disassembler-Output wieder in eine übersetzbare Form(was bei weitem nicht immer gelingt) zu bekommen, als ein paar Stellen in der kompilierten Datei zu verändern und z.B. ein paar Dll-Aufrufe einzufügen.
 
Zurück
Oben