genau mit dem selben Krempel habe ich mich auch schon fuer den rm2k rumgeschlagen fuer meine Patches .. und bei allen habe ich dann aus Zeitmangel aufgegeben.
Ich hatte sigar mal eine Loesung fuer F12+runter+enter, aber dort war das Problem dann, dass das timing exakt stimmen musste. Also hab ich die funktion irgendwann ausgebaut, weil es einfach zu kompliziert war, die tastendruecke in exakt dem richtigen moment zu senden.
Fuer das Load Problem waere es wohl eine loesung, wenn man im Spiel die Addresse der Load Subroutine mit einem Debugger oder einem Disassembler rausbekommen wuerde, und dann in einer dll (z.B. dem Tastenpatch), die vom rm2k geladen wird (-> gleicher addressraum) als funktionspointer aufruft. Allerdings hab ich das noch nicht probiert, da ich mich mit debuggern nicht so sonderlich auskenne und keine Zeit hab zum einarbeiten ...
Beim rm2k3 sieht es noch schlechter aus, da dort die moeglichkeit wegfaellt, ueber eine DLL freien Zugriff auf die Programmbibliotheken zu bekommen ...
Das Problem mit dem Aendern der Variablen ist aehnlich vertrackt. Zwar kannst du mit Read/WriteProcessMemory daten lesen und schreiben, das Problem ist allerdings, zu wissen, wo die Daten stehen. Da der maker seinen Speicher dynamisch alloziiert, stehen die bei jedem Start idR wo anders im speicher. Zwar sollte es eine konstante Addresse geben (die pointervariable zum Speicherbereich) die die addresse enthaellt, und ich konnte auch schon die Routine ermitteln (rm2k), in der die Variablen geaendert werden, doch fehlte mir dann zeit und ausdauer, den schritt zu komplementieren.
Alles in allem ein kompliziertes Problem, selbst fuer mich.
Ich kann ja mal posten, was ich damals so rausbekommen habe ...
Vielleicht nuetzt es ja einem. Alle Angaben natuerlich ohne Gewähr.
Bitte nicht schlagen .. ich hab den Code vor Jahren geschrieben, und war damals noch dumm und unwissend ^^
Ziel war es also, beim ersten Aufruf von ChangeVariable im Spiel nach injektion des neuen codes den wert des Pointers zu bekommen. Den habe ich kurzerhand im Programmsegment nops ueberschreiben lassen, weil ich dann genau wusste, wo er steht. nach dem change Variable, wenn ich den pointer hatte, ersetzte ich den veraenderten code wieder durch das original. Das Problem watr aber immer, man brauchte Change Variable dazu, wobei die ausfuehrung exakt einmal kommen musste. wuerde in der zeit vor der wiederherstellung nochmal change variable durchgefuehrt, haette man das Programm ins Nirvana geschickt.
Das Verfahren hat wirklich funktioniert, allerdings war es mir fuer den allgemeinen Markt zu unsicher.