Hallo,
ich stehe momentan vor einem Problem, das mir langsam sämtliche Nerven raubt. Ich den im Menü angezeigten Versions-String von Ultima Online zu verändern, um sicherzustellen, dass es von meinem Loader aus gestartet wurde und nicht über anklicken der Exe.
Dazu gab es eine wunderschöne Library, welche sowohl die Verschlüsselung aus UO entfernte, wie auch eine "Inject" Methode zur Verfügung stellte, die meine DLL Aufruft, um dann den Versions-String zu verändern. Das funktioniert soweit super, doch klappt das ganze nicht unter Windows 9x. Dort wird die DLL gar nicht erst aufgerufen - warum auch immer. Nun war mein Gedanke - warum nicht, wie jeder GameTrainer auch, einfach den Speicher von meinem Programm aus verändern. Das habe ich bisher nicht ohne AccessViolations hinbekommen ... oder anders gesagt: Ich habt keine Ahnung wie!
Von der DLL aus habe ich das bisher folgendermaßen gemacht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure InjectVersion; const local_version = ' - MyString'; s_ver = '%d.%d.%d%s'; len_ver = 10; var Process: THandle; P: PChar; ModInfo: ModuleInfo; OldProtect, VerFormat: LongWord; Buf: PByteArray; i: Integer; begin Process := GetCurrentProcess; if not (Process < HINSTANCE_ERROR) then begin GetModuleInformation(Process, GetModuleHandle(nil), @ModInfo, SizeOf(ModInfo)); VirtualProtect(ModInfo.lpBaseOfDll, ModInfo.SizeOfImage, PAGE_EXECUTE_READWRITE, OldProtect); Buf := ModInfo.lpBaseOfDll;
VerFormat := 0; for i := 0 to ModInfo.SizeOfImage - 200 do begin if (VerFormat = 0) and CompareMem(@(buf[i]), PChar(s_ver), len_ver) then begin VerFormat := i; break; end; end;
if VerFormat > 0 then begin P := local_version; CopyMemory(@buf[VerFormat + 12], P, Length(local_version)); end; end; end; |
Das hat wie gesagt Funktioniert - doch wie soll ich das von außerhalb des Prozesses machen? (Und bitte - es soll sowohl unter Windows NT wie auch Windows 9x funktionieren!)
P.S.: Ich weiss von ReadProcessMemory und WriteProcessMemory, doch das waren eben die Funktionen, bei denen ich nicht weiter als bis zu einer Access Violation gekommen bin. Also wenn das die einzige Möglichkeit ist, dann schreibt mir bitte auch, wie ich damit den GESAMTEN Speicher des Prozesses nach dem gesuchten String durchsuche.
Ich hoffe jemand kann mir weiterhelfen! Danke.
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
Moderiert von
Tino: Überflüssige Absätze entfernt.