Speicherzellen



  • Hallo,

    ich suche nach einer Möglichkeit die Adresse von Speicherzellen in einer int Variablen zu speichern.

    Die Adresse über cout auszugeben klappt wunderbar, aber sie bspw in einer Variablen x zu speichern klappt nicht.

    int a;

    cout << &a;

    _____________

    int a, x;

    x = &a; /* funktioniert nicht */

    Verbessert mich bitte, falls ich falsch liege:), &a ist die Adresse des Zeigers, der auf a zeigt, vom Typ Zeiger also. Also ist x = &a einfach eine Typverletzung. Andererseits wird die Adresse durch eine Hexadezimalzahl beschrieben, die im Prinzip schon ein Integer ist.

    Wie kann ich jetzt die Adresse von beliebigen Variablen in anderen Integervariablen speichern?

    Als i-tüpfelchen würde ich gerne noch auf beliebige Speicherzellen meines Hauptspeichers Einsicht erhalten. Also auch auf welche, die mein Programm nicht nutzt. Falls mir jemand mit C / C++ Code und/oder einer Erklärung helfen könnte, wäre ich sehr dankbar:)

    Gruß, Josef.



  • Zeiger:

    int i = 3;
       int * p = &i; //p enthaelt die Adresse von i
    

  • Mod

    Wie kann ich jetzt die Adresse von beliebigen Variablen in anderen Integervariablen speichern?

    Wie kommst du auf die Idee, dass ein Integer ausreicht? Schließlich ist der Wertebereich begrenzt. Auf aktuellen Systemen geht das mit den üblichen Größen für Integers jedenfalls nicht.

    edit: Und die allseits beliebte, weil wichtige, Frage: Wozu?



  • Ja, dann eben Longinteger. Hab vor nicht allzulanger Zeit mit C++ angefangen.
    Danke Tachyon btw:)

    Jetzt würde mich gerade noch interessieren, wie ich bspw die beliebige Speicherzelle 0x0015FF02 auslesen könnte.



  • josefh schrieb:

    Ja, dann eben Longinteger. Hab vor nicht allzulanger Zeit mit C++ angefangen.
    Danke Tachyon btw:)

    Jetzt würde mich gerade noch interessieren, wie ich bspw die beliebige Speicherzelle 0x0015FF02 auslesen könnte.

    So ohne Weiteres gar nicht. Das Betriebssystem weiß, welcher Speicher Deinem Programm gehört, und welcher nicht. Wenn Dein Programm versucht, auf Speicher zuzugreift welches ihm nicht gehört, gibts eine read/write-access-violation.
    Betriebssysteme bieten allerdings APIs für sowas an. Solange Du nicht Sattelfest in C++ bist, solltest Du die Finger davon lassen.



  • int *p = (int*)0x0015FF02;
    cout << *p;
    

    Aber ich wette ein Bier, daß dein BS dir auf die Finger klopfen wird. 😉



  • ich weis nicht was du über hauptspeicher verstehst aber
    ich glaub du meinst auch das?

    int *ptr=new int(0);
    

    ein zeiger der im freien speicher eine int reserviert



  • Lass mich Raten: Du kennst die Adresse einer Variable eines Spiels und willst sie modifizieren. Aber so nicht!

    EDIT: @Caligulaminus Was soll der C-Cast?



  • EOutOfResources schrieb:

    EDIT: @Caligulaminus Was soll der C-Cast?

    Geht's auch ohne? Ich hab's nicht probiert.
    Falls Du auf C-Cast vs. C++-Casts anspielen willst: Die gezeigte Angelegenheit ist doch eh hochgradiger Unsinn. Wie soll man denn eine willkürlich gewählte Adresse "richtig" casten? 😃



  • EOutOfResources schrieb:

    Lass mich Raten: Du kennst die Adresse einer Variable eines Spiels und willst sie modifizieren. Aber so nicht!

    Höhö. Also, wenn du das machen möchtest, musst du die entsprechenden Funktionen des OS's benutzen. Unter Windows, glaube ich, ist es relativ einfach, auf den Speicher eines anderen Prozesses zuzugreifen, solange du diesen ansprechen kannst.

    Caligulaminus schrieb:

    Geht's auch ohne? Ich hab's nicht probiert.
    Falls Du auf C-Cast vs. C++-Casts anspielen willst: Die gezeigte Angelegenheit ist doch eh hochgradiger Unsinn. Wie soll man denn eine willkürlich gewählte Adresse "richtig" casten? 😃

    Gar nicht. Aber es gibt void -Zeiger, oder?



  • bei linux ist das einfach mit pointer
    kann man sogar beim os selber manipulieren

    unter windows musst du die api benutzen
    und das programm explizit angeben
    sonst gibts keinen zugriff auf den speicher
    soweit ich weis



  • Caligulaminus schrieb:

    EOutOfResources schrieb:

    EDIT: @Caligulaminus Was soll der C-Cast?

    Geht's auch ohne? Ich hab's nicht probiert.
    Falls Du auf C-Cast vs. C++-Casts anspielen willst: Die gezeigte Angelegenheit ist doch eh hochgradiger Unsinn. Wie soll man denn eine willkürlich gewählte Adresse "richtig" casten? 😃

    reinterpret_cast<ptrdiff_t>(p)
    Mir hat aber jemand mal etwas von gewissen Dingen erzählt, die der Standard nicht garantiert, und dazu könnte auch dieser Cast hin und zurück gehören.



  • josefh schrieb:

    Hallo,
    Verbessert mich bitte, falls ich falsch liege:), &a ist die Adresse des Zeigers, der auf a zeigt, vom Typ Zeiger also.

    Nein! &a gibt die Speicheradresse zurück, in welcher sich a befindet. Du hast doch da im Moment überhaupt keinen Zeiger?

    sebi91 schrieb:

    ich weis nicht was du über hauptspeicher verstehst aber
    ich glaub du meinst auch das?

    int *ptr=new int(0);
    

    ein zeiger der im freien speicher eine int reserviert

    Wie kann er so auf eine beliebige Adresse im Speicher zugreifen? Er greift so über den Zeiger auf den Speicher zu, den du mit new int(0) angefordert und mit Null initialisiert hast. Er wollte aber auf eine beliebige Speicheradresse zugreifen, die seinem Programm nicht "gehört". Klar Zeiger braucht er dazu, aber mit diesem noch Speicher zu reservieren ist total unnötig, wobei das wie ja auch schon erläutert wurde, so sowieso nicht funktioniert.

    Lg freeG

    Lg freeG



  • @josefh
    unter windows:
    read http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx
    write http://msdn.microsoft.com/en-us/library/ms681674(VS.85).aspx
    hat bei mir immer gut geklappt

    wie gesagt unter linux reicht ein zeiger mit der ziel adresse
    und wenn du den richtigen speicher erwischt schmirt es ab ^^

    @fr33g
    wir wissen ja nicht einmal welches os

    sebi91 schrieb:

    bei linux ist das einfach mit pointer
    kann man sogar beim os selber manipulieren

    unter windows musst du die api benutzen
    und das programm explizit angeben
    sonst gibts keinen zugriff auf den speicher
    soweit ich weis



  • Nimm std::uintptr_t aus cstdint.
    Der Typ ist dazu da, Speicheraddressen als normalen Integer zu halten.
    Von und zu Pointer wird mit einem reinterpret_cast<> konvertiert.



  • sebi91 schrieb:

    wie gesagt unter linux reicht ein zeiger mit der ziel adresse

    Auch Linux betreibt virtuelle Speicherverwaltung. Die selben Speicheradressen zweier verschiedener Prozesse bedeuten unterschiedlichen physischen Speicher (sie werden auf unterschiedliche Pages gemappt). Wenn der andere Prozess keinen shared memory exportiert, kommst du nicht an seinen Speicher, und dann auch nur an die Teile, die er exportiert. In diesem Fall bedeuten im Zweifel verschiedene Adressen verschiedener Prozesse den selben physischen Speicher. Als root über /dev/mem, wenn der Kernel das bereitstellt, kann man da mehr machen, aber ein einfacher Zeiger, um in anderen Prozessen herumzufuhrwerken? Nein.

    Unter DOS, wenn kooperatives Multitasking im Real-Mode betrieben wurde, da konnte man solche Dinge machen, aber der Protected-Mode ist inzwischen bald 30 Jahre alt. Du kannst davon ausgehen, dass dieser Trick nirgends mehr funktioniert.


Log in to reply