Dein "Zufall":
Delphi-Quellcode:
const
PositionVonStringReplace = 14346027;
Gott: array[0..3] of AnsiChar = 'Himi';
var
MeinSpeicherDenIchGleichÜberschreibenWill: {Pointer}Integer;
begin
RandSeed := Integer(Gott);
MeinSpeicherDenIchGleichÜberschreibenWill := Random(999999999); // Zufällige Speicherposition suchen
if MeinSpeicherDenIchGleichÜberschreibenWill = PositionVonStringReplace then
ShowMessage('Gleich ist StringReplace kaputt :(');
end;
Rein theoretisch kann neu zu reservierender Speicher überall im
RAM landen, genauso wie DLLs nicht immer an selber Stelle liegen müssen, ABER ...
Vorallem Delphi DLLs liegen gern nicht dort, wo sie sollen, denn fast niemand gibt eine ordentliche ImageBaseAddress an, womit fast alle Delphi-DLLs eigentlich an selber Stelle liegen würden und Windows sowieso Diese immer an dererer Stelle laden muß,
aber Windows cached sich gern gepatchte Module und läd die DLLs dann oftmals wieder an selber Sellte, wo sie schonmal geladen wurden. Bzw. wiederverwendet die selben Module, welche bereits in einer anderen Anwendung geladen sind.
FastMM/VirtualAlloc könnte jedesmal beim GetMem was Anderes liefern, aber es reagiert auch gern mal gleich, da das Programm beim Start ja auch jedesmal das Selbe macht.
Auch der ProgrammCode (EXE/
DLL/...) liegt im Arbeitsspeicher ... eigentlich sollte der vorm Überschreiben geschützt sein, aber man kann ihn womöglch dennoch überschreiben und jetzt muß nur noch etwas von der Funktion StringReplace überschrieben werden.
Aber ganz genau kann man es letztendlich nur sagen, wenn man DEIN Programm analysiert, was es nun wirklich macht,
also z.B. die letzte falsche Schleife debuggen und gucken ob und was wo überschrieben wurde.