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.


Anmelden zum Antworten