Auf Speicherzelle außerhalb des Programms zugreifen



  • Hallo,

    wie ist es möglich mit einem Zeiger auf eine Speicherzelle zuzugreifen, welche außerhalb des Programms liegt?

    So erhalte ich z.B folgende Fehlermeldung, wenn ich versuche einen Zeiger auf die Adresse 0x00 zu setzen:

    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

    VIelen Dank



  • Wenn du unter einem Betriebssystem wie Windows/Linux etc programmierst dann musst du Speicher vom System anfordern und kannst, wenn du ihn auch bekommen hast, darauf zugreifen. Feste Adresse die nicht zu deinem zugewiesenen Speicherbereich gehören werden mit einer Zugriffsverletzung quittiert.

    Es wäre also schön zu wissen um welches System es sich handelt, denn C kann man ja heute auf so allen möglichen programmieren von Mikrocontrollern, GPUs bis hin zu komplexen Systemen wie Windows. Das Verhalten ist da jedesmal anders.

    Also bitte schreib für welches System du kompilierst und geben vielleicht noch ein Codesnipsel der entsprechenden Stelle im Code preis, dann kann man dir hier bestimmt sehr schnell helfen.

    Gruß Chris



  • Betriebssystem: Windows 32 bit

    int main(void)
    {
    
    	int *erg;
    
    	printf("%x, Wert: %d\n", erg, *erg);
    
            erg = 0x01352B20;
    
    	printf("%x, Wert: %d \n", erg, *erg);
    }
    	getch();
    	return 0;
    }
    

    Ich möchte den Wert (4Byte) aus der Speicherzelle mit der Adresse 01352B20 auslesen.



  • Liegt deine Fehlermeldung mit der geschweiften Klammer zusammen die da zuviel ist?
    Bei mir kompiliert das nach der Korrektur und ich bekomme eine Ausgabe und danach hängt sich das Programm auf.

    Die erste Ausgabe der Adresse von erg und dem Wert ist ja undefiniert und zeigt irgendwo hin.

    Die zweite Ausgabe zeigt auf eine von dir gewählte Adresse und auch hier kann man nicht vorhersagen ob die Adresse vom System freigegeben ist oder nicht.

    Beantwortet das deine Frage?



  • also das mit der Klammer habe ich in meinem Programm nicht! Aber danke für den HInweis. Die erste Ausgabe wird bei mir auch angezeigt, die 2. jedoch nicht mehr. Das Programm stürzt vorher ab: Zugriffsverletzung beim Lesen an Position 0x01352b20

    Kann ich diese Zugriffsverletzung irgendwie umgehen?



  • Du müsstest irgendwie in den Kernelmode Ring0 kommen. Wie und ob die WinAPI das abdeckt weiß ich nicht, vielleicht mal in dem WinAPI-Forum nachfragen?



  • Jedes Programm hat seinen eigenen virtuellen Adressraum. Gut möglich, dass 0x01352B20 in deiner Pagetable nicht vorhanden ist und die Adresse schlicht nicht auf physischen Speicher gemappt werden kann.

    Die Adresse sieht so aus, als zeige sie in den Heap. Wenn du meinst, du könntest auf die Art Daten aus anderen Prozessen auslesen: Das geht nicht. Dein 0x01352B20 ist nicht ihr 0x01352B20.



  • das ist aber genau das, was ich vor habe...

    hast du eine idee, wie ich das Problem lösen kann?



  • Du müsstest auf betriebssystemspezifische Funktionen zugreifen, in deinem Fall wäre die gesuchte Funktion ReadProcessMemory.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten