Ein Programm verändert Wert auf einer Adresse nicht



  • Hallo allerseits 😉
    Ich habe eben ein kleines Programm geschrieben das ein anderes Aufruft.
    Das gibt den Wert einer Variable und die Adresse im Speicher aus.
    Nun übergebe ich dem ersten Programm die Adresse und möchte den Wert über den Pointer ändern aber das funktioniert nicht. Er gibt keine Fehler aus sondert man meint es verweist auf eine andere Adresse obwohl diese gleich sind. Naja soviel zur Theorie hier ist die Praxis:

    //test.exe
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int main (void) {
        int adresse;
        int *pointer;
    
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
    
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );
    
        ShellExecute(0, TEXT("open"), TEXT("test2.exe"), NULL, NULL, SW_SHOWNORMAL);	
    
        printf("Eingabe Adresse: ");
        scanf("%i", &adresse);
    
        pointer = adresse;
    
        *pointer = 23;
    
        getchar();
    }
    
    //test2.exe
    #include <stdio.h>
    
    int main (void) {
        int x = 5;
    
        printf("x = %i -> &x = %i\n", x, &x);
    
        getchar();
    
        printf("x = %i -> &x = %i\n", x, &x);
    
        getchar();
    
    }
    

    So wenn ich test.exe starte wird test2.exe gestartet. Dieses gibt die Adresse von x aus diese gebe ich in test.exe ein und es wird ein neuer Wert geschrieben aber wenn ich bei test2.exe auf Enter drücke ändert sich nichts. Vielleicht ist es ja nur ein denkfehler.



  • Andyman schrieb:

    Vielleicht ist es ja nur ein denkfehler.

    Du denkst, beide Programme greifen auf denselben Speicher zu. Das ist aber nicht so. Jedes Programm bekommt seinen eigenen Speicher vom Betriebssystem und kann nicht so ohne weiteres in Speicher von anderen Programmen herumpfuschen.



  • Das heißt also das wenn mir test2.exe die Adresse 2296235 anzeigt eine andere ist als wenn ich bei test.exe auf diese Adresse zugreife?



  • Ein Prozess kann nicht so ohne weiteres auf den Speicher eines anderen Prozesses zugreifen. Die Adressen sind sowieso keine physischen, sondern nur virtuelle. Wenn deine Programme kommunieren sollen, wäre das Stichwort inter-process communication (IPC). Ansonsten bietet die WinAPI, soweit ich weiß, auch Funktionen an, mit denen man den Speicher eines fremden Prozesses öffnen kann (sofern man die Rechte dazu hat).



  • Andyman schrieb:

    Das heißt also das wenn mir test2.exe die Adresse 2296235 anzeigt eine andere ist als wenn ich bei test.exe auf diese Adresse zugreife?

    Jo. Die Adresse bezieht sich auf den Adressraum des jeweiligen Prozesses. Je nachdem, was genau Du vorhast, bietet sich, wie F schon erwähnt, Interprozesskommunikation an, oder eben die Nutzung der OS - Möglichkeiten, die Dir Zugriff auf Speicher von fremden Prozessen verschaffen können. Das läuft dann aber etwas komplexer ab, als das jetzt bei Dir aussieht.
    Falls Du Windows benutzt, kannst Du so etwas im Winapi - Forum finden.



  • Der Formatspecifier für Zeiger bei printf ist "%p"

    printf("x = %i -> &x = %p\n", x, &x);
    

    Die Angabe ist dann aber in Hex.



  • Ohlles Kloar.
    Dachte ich mir schon iwie sonst wär das eine riesige Sicherheitslücke!
    Aber ich glaube mal irgendwo gelesen zu haben das wenn ein Programm ein anderes aufruft die "Variablen" zu dem Speicherbereich des ersten Programms gehören.
    Aber egal 😉
    Merci für die Antworten!


Log in to reply