Autor Thema: Fremde Memory Adresse verändern  (Gelesen 4087 mal)

javadomi

  • Gast
Gespeichert
« am: 19. July 2005, 15:25 »
Ich habe ein C++ Programm geschrieben, dass die globale integer Variable a mit 5 deklariert. Dannach gibt er ihren Wert aus und die Adresse der Variable. Jetzt wartet das Programm, bis der Benutzer Enter drückt. Nun kommt Assembler ins Spiel. Ich möchte nun, dass der Wert von a jetzt 4 beträgt. Dazu habe ich ein Assembler Programm geschrieben. Diese Codezeilen sollten eigentlich a den Wert 4 zuweisen:

MOV ax,0041h
MOV es,ax
mov es:[C0D4h],4

Ich bin in Assembler noch nicht so erfahren. Das C++ Programm gibt die Adresse 0041C0D4 aus. Dieses Assembler programm lässt sich auch nicht kompilieren. Was habe ich für Fehler gemacht?

PS: Nach dem Beenden des Asm-Programms drückt der Benutzer im C++ Programm Enter und es erscheinen die neuen Werte von a.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 19. July 2005, 16:21 »
Hi,

offensichtlich ist dein Programm ein Protected Mode (vermutlich ein Windows-)Programm, weil die Adresse 0x41C0D4 > 1 MByte ist. Das nächste mal bitte miterwähnen ;)

Im Protected Mode gilt eine andere Adressierung als im Real Mode. Du kannst nicht einfach auf die Adresse 0x41C0D4 zugreifen indem du das Segment auf 0x41 und das Offset auf 0xC0D4 setzt, weil die Segment-Register im Protected Mode eine andere Bedeutung haben als im Real Mode.

Im Protected Mode, vielleicht auch bekannt als 32 Bit Modus, wird mit 32 Bit Adressiert, sonst hätte er den Namen nicht. Auf die Adresse 0x41c0d4 greifst du so zu:

mov [0x41c0d4], 4

fertig! DS und ES und wie se nich alle heissen sind bereits korrekt gesetzt. Jede Änderung würde wahrscheinlich den Absturz des Programms (genauer General Protection Fault oder dt. Allgemeine Schutzverletztung) zur Folge haben.

So um die nächste Frage vorzugreifen: ;)
Zitat
Der PorkChicken erzählt Bullshit! Es funktioniert immer noch nicht!

Das liegt an dem "Protected" (= geschützt) in Protected Mode. Windows läuft im Protected Mode. Das heisst, die einzelnen Programme sind voreinander geschützt. Dein Assembler Programm kann nicht einfach so auf dein C++ Programm zu greifen. Dazu braucht es vorher entsprechende Rechte. Dass das nicht ganz einfach ist die zu beschaffen, ist dir hoffentlich klar. Google dazu nach ordentlich Tutorials/Dokus zu VirtualAlloc und ReadProcessMemory und was dir dabei noch so über den Weg läuft. Mit Assembler würde ich das nicht lösen, sondern auch mit C (oder C++ meinetwegen ...).
Dieser Text wird unter jedem Beitrag angezeigt.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 19. July 2005, 19:23 »
(HalbOffTopic)
Der PorkChicken erzählt Bullshit!  :twisted:
Zitat

Im Protected Mode, vielleicht auch bekannt als 32 Bit Modus, wird mit 32 Bit Adressiert, sonst hätte er den Namen nicht. Auf die Adresse 0x41c0d4 greifst du so zu:

Protected Mode hat nix mit 32 Bit zu tun, es gibt auch 16 Bit Protected Mode. Aber die meisten sind mit 32 Bit, das andere is eigendlich Schwachsinn. Von daher isses halb richtig.
Das nur von meinen besserwissrigen Minderwertigkeitskomplexen.  :twisted:
(/HalbOffTopic)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

javadomi

  • Gast
Gespeichert
« Antwort #3 am: 23. July 2005, 13:24 »
Könnte mir jemand so ein Beispiel schicken, denn ich blicke da nicht ganz durch.

 

Einloggen