Ich hab das noch nie gemacht, aber ich stelle mir das so vor:
Man findet zuerst die Speicheradresse A zu dem Wert, den man ändern will. Dann geht man alle anderen Speicherstellen durch und berechnet die Differenz der Werte an diesen Positionen zu A und speichert sie.
Anschließend startet man das Programm neu und macht das selbe wie vorher. Jetzt vergleicht man die beiden Listen von Differenzen und schaut, ob an bestimmten Stellen gleiche Differenzen stehen. Ist das der Fall, dann sollte die gesuchte Basisadresse B gleich der Adresse sein, an der diese Differenz gefunden wurde MINUS die Differenz selbst.
Also angenommen das Programm nutzt den Speicherbereich 10 bis 24. Dann sucht man den Wert X, den man ändern will, und findet ihn an Adresse A=20. Dann berechnet man die erste Differenzentabelle. Obwohl eine Adresse 32 oder 64 Bit hat, geht man sicherheitshalber nur byteweise vor.
Code: Alles auswählen
Adresse Wert Differenz
10 ... ...
11 ... ...
12 ... ...
13 ... ...
14 18 2
15 ... ...
16 ... ...
17 ... ...
18 ... ...
19 ... ...
A X A-X
21 ... ...
22 ... ...
23 ... ...
Die Stellen mit '...' sind zum Erklären gerade unwichtig. Dann startet man das zu untersuchende Programm mal neu, findet das neue A' = 18 und macht wieder eine Differenztabelle.
Code: Alles auswählen
Adresse Wert Differenz
10 ... ...
11 ... ...
12 ... ...
13 ... ...
14 16 2
15 ... ...
16 ... ...
17 ... ...
A' X A'-X
19 ... ...
20 ... ...
21 ... ...
22 ... ...
23 ... ...
Wie man sieht, ist an Stelle 14 wie beim ersten mal die Differenz 2. Das bedeutet an dieser Stelle befindet sich wahrscheinlich ein statischer Pointer, der bei jedem Programmstart gleich bleibt.
Wenn wir also den Wert an Stelle 14 holen und plus 2 rechnen, dann bekommen wie immer die Speicheradresse von unserem Wert X.