Verständnisproblem bei dem mov-Operator
-
Hallo,
in einer sehr einfachen Konsolenanwendung wird eine Integer-Variable inkrementiert, was ich ausbessern möchte.
Die Inkrementierung der Variable findet hier statt:
004114DE C745 F8 00000000 MOV DWORD PTR SS:[EBP-8],0 004114E5 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] 004114E8 83C0 01 ADD EAX,1 004114EB 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX 004114EE 8BF4 MOV ESI,ESP
Nun habe ich dazu einige Fragen: 1.) Was bedeutet das "SS" da? Wofür steht ds PTR?
-
SS steht für Stack Segment.
PTR steht für Pointer.Was möchtest Du da ausbessern und wie, Dummkopf?
-
Ich möchte über ein externes mit ReadProcessMemory und WriteProcessMemory mein Programm beeinflussen.
Wie heißt die "Nummer", mit der man mit dem beiden Funktionen darauf zugreifen kann? Öfters ist es folgendermaßen:
01234567 MOV DWORD PTR DS:[7654321],EAX
sodass man mit der Nummer 7654321 zugriff auf die Variable hat.
Dummkopf
-
Diese "Nummer" ist ein "Displacement". Es kann sein, dass es öfters auftaucht, muss aber nicht die Regel sein. Die Prozessoren ab 386 unterstützen elf Adressierungsarten. In ein Paar Addressierungsarten kann ein "Displacement" benutzt werden.
-
Es ist ausserst wahrscheinlich, dass diese "Nummer" (nennt man uebrigens allgemein (Speicher-)Adresse, bzw. beim x86 auch Offset) in deinem 1. Codeschnippsel oben nicht konstant waere.
Allem Anschein nach handelt es sich um einen Wert im Stack, also wohl entweder eine lokale Variable oder einen Funktionsparameter.
Die kannst du nicht einfach so von aussen veraendern.
Zum einen existiert diese Variable nur zu ganz bestimmten (vermutlich sehr kurzen) Zeitabschnitten ueberhaupt und zum anderen kann deren Adresse zB. je nach OS davon abhaengen wie gross das Programm ist, wie gross der Stack ist, oder sie ist einfach zufaellig. Zumindest haengt sie davon ab, an welcher Stelle im Programm die Funktion mit diesem Codeschnippsel aufgerufen wird.Das wird so nicht funktionieren. Such dir eine (globale) Variable mit konstanter Adresse oder einen komplett anderen Ansatz.
-
Gibt es nun keine Möglichkeiten auf die Variable zuzugreifen?
-
Doch, klar:
zB.
1.
Von innen, also im Programm selbst.
Weitere Zugriffe auf die Variable musst du dann in den betreffenden Code direkt einfuegen (den in der .exe, bzw. sofern vorhanden, den Quellcodes und nicht im laufenden Betrieb).
2.
Indem du den Code in einer kontrollierten Umgebung zB. einem Debugger laufen laesst.
-
das zweite code snipple ist nicht das stack, sondern das datensegment. da kannst du vermutlich direkt drauf zugreifen, das existiert wohl laenger.