Speicheradresse mit neuem Wert füllen

So überraschend ist das nicht. Wenn bei jedem Programmlauf die selbe Folge von Speicherallokationen erfolgt, ist es doch nachvollziehbar, dass das Betriebssystem immer dieselben Speicherbereiche vergibt. Ich denke ihr macht bei euren Überlegungen den Fehler, dass ihr davon ausgeht, diese Speicheradressen wären physische Adressen. In Wirklichkeit handelt es sich aber um virtuelle Adressen.

Dass man im Allgemeinen nicht davon ausgehen kann, ist klar. Aber verwunderlich ist es auch nicht, wenn es mal passiert. Wo andere Programme im physischen Adressraum liegen hat ja keine Auswirkung auf meinen virtuellen Adressraum.

Der Einstiegspunkt eines Programms befindet sich immer an derselben virtuellen Speicheradresse. Und nur mit virtuellen Adressen hat man es in einem Benutzer-Programm zu tun. Ich glaube so ganz hast du das Prinzip der virtuellen Speicherverwaltung noch nicht verstanden…

Grüße,
Matthias

Welche virtuelle Adresse ist das denn? Abgesehen davon rede ich die ganze Zeit ja von virtuellen und NICHT von physikalischen Adressen.
Hab eben mal 2 exakt gleiche Programme geschireben und die Adresse von main() geprüft, aber beide haben eine andere.
Wenn beide aber die gleiche Startadresse hätten, müsste ja auch demnach die Adresse der main() identisch sein, oder?

Mfg Pain-maker

Edit: Meines Wissens nach ist das mit dem Einstiegspunkt übrigens Compiler und/oder OS abhängig. Aber wenn ich da was missverstanden hab, lasse ich mich gerne belehren
 
Zuletzt bearbeitet:
Oki, dann danke ich für die Aufklärung :)
Kann mir trotzdem noch jemand sagen, warum die main()-Adresse unterschiedlich ist?

(Hoffe das wird jetzt nich zu sehr Off-Topic)
 
Die Adresse ist nicht unterschiedlich. Du musst nur immer sehen, dass du eine absolute Adresse betrachtest. Wenn du davon die absolute Imagebasis abziehst kommst du auch auf einen konstanten Wert. Wenn du jedoch die virtuellen Adressen beachtest ist auch die virtuelle Dateibasis (i.d.R. glaub 0x400000 bei Exe-Dateien) konstant, und daher auch die virtuelle Adresse von main.
 
Also ich habe das Programm "Baseadress1" und "Baseadress2":
PHP:
/**
 * Programm: Baseadress1
 */
int main() // 0x012B1350
{
	return 0;
}

PHP:
/**
 * Programm: Baseadress2
 */
int main() // 0x00BB1350
{
	return 0;
}

Die Adresse von main() ist bei dem einen 0x012B1350 und bei dem anderen 0x00BB1350. (Differenz: x700000)
Erwartungsgemäß hätte die aber gleich sein müssen, oder?

Mfg Pain-maker
 
Zuletzt bearbeitet:
Also ich habs jetz mit verschiedenen möglichkeiten getestet aber ich komm leider nicht weiter ,
ich nehme mal an es sind nur 3 oder 4 Zeilen die ich noch in meinen Code einfügen muss allerdings weis ich ncht welche und wo

ewentuell könnte jemand meinen Code soweit ergänzen das das der Speicher auf dauer so bleibt wie ich ihn eingestellt habe
 
Also ich habe das Programm "Baseadress1" und "Baseadress2":
PHP:
/**
 * Programm: Baseadress1
 */
int main() // 0x012B1350
{
	return 0;
}

PHP:
/**
 * Programm: Baseadress2
 */
int main() // 0x00BB1350
{
	return 0;
}

Die Adresse von main() ist bei dem einen 0x012B1350 und bei dem anderen 0x00BB1350.
Erwartungsgemäß hätte die aber gleich sein müssen, oder?

Mfg Pain-maker

Warum sollte die Adresse der Main-Funktion in zwei unterschiedlichen Programmen gleich sein?
 
Also ich habs jetzt verstanden. (Danke liebes Google^^)
Ja die Startadresse ist unter Windows immer 0x400000, ausser unter Windows Vista / 7, da das eine "Baseadress randomization" benutzt.
(Daher hat das auch bei mir unter Win 7 auch alles nich ganz hingehaun)
siehe: http://blogs.technet.com/b/askperf/...der-and-address-space-load-randomization.aspx
Wo ich aber wieder zu meiner vorherigen Aussage komme, nämlich das das auch durchaus OS bzw. Compiler/Linker-Abhängig sein KANN.

@glnklein:
Nun wir haben ja bereits festgestellt, dass MW2 den Wert immer wieder zu ändern scheint, daher geht es nicht diesen dauerhaft zu ändern ohne das du jedesmal wieder eingreifst.
Was bekommst du denn für einen Fehler wenn du folgenden Code hast:
Code:
	case 2:
	{
		cout << "\nneuer wert maximum Spieler ? ";
		int wert2;
		cin>>wert2;     
		cout << "\n Schreibe ... \n"; 
		 
		 int *targetAddr = (int*)0x0645C408;
		 
		 // Endlosschleife
		 for(;;)
		 {
		     if(*targetAddr != wert2)
		          WriteProcessMemory(handle,(void*)(0x0645C408),&wert2,6,&puffer);

		     // Gegen CPU-Überlastung
		     Sleep(10);
		 }
	}
	break;
 
Zuletzt bearbeitet:
@glnklein:
Nun wir haben ja bereits festgestellt, dass MW2 den Wert immer wieder zu ändern scheint, daher geht es nicht diesen dauerhaft zu ändern ohne das du jedesmal wieder eingreifst.
Was bekommst du denn für einen Fehler wenn du folgenden Code hast:
Code:
	case 2:
	{
		cout << "\nneuer wert maximum Spieler ? ";
		int wert2;
		cin>>wert2;     
		cout << "\n Schreibe ... \n"; 
		 
		 int *targetAddr = (int*)0x0645C408;
		 
		 // Endlosschleife
		 for(;;)
		 {
		     if(*targetAddr != wert2)
		          WriteProcessMemory(handle,(void*)(0x0645C408),&wert2,6,&puffer);

		     // Gegen CPU-Überlastung
		     Sleep(10);
		 }
	}
	break;

wenn ich das so übernehme dann kommt

Test.exe Funktioniert nicht mehr
Windows kann online nach einer Lösung für das Problem suchen .

usw.


Warum weis ich nicht
 
Zurück