Wo ist der Fehler? Bzw kann man das anders schreiben?



  • hallo!

    //---------------------------------------------------------------------------
    
    #include <iostream.h>
    
    int main()
    {
            for(int i=0;;i++)
            {
                    try
                    {
                            int* huhu = reinterpret_cast<int*>(i);
                            cout<<*huhu;
                    }
                    catch(...)
                    {}
            }
    
    }
    //---------------------------------------------------------------------------
    

    Warum läuft das nicht? Windows.



  • was soll das programm überhaupt machen?



  • iostream.h
    cout ohne std:: bzw using...
    main ohne return
    zugriff auf speicher der dem programm nicht gehört (access violation -> appcrash)



  • Nachrichtentexter schrieb:

    iostream.h
    main ohne return

    unsinn
    unsinn

    iostream ohne .h
    return ist auch ned nötig (keins entspr. return 0)

    @topic: was soll der quark?!



  • mensch, ich meine warum das programm abstürzt, eigentlich soll das programm bei speicherverletzung weiter laufen wegen ausnahmebehandlung. Also ich möchte es so realisieren
    @ helola: Das Program soll den wert ausgebn den die adresse i hat



  • neoexpert schrieb:

    mensch, ich meine warum das programm abstürzt, eigentlich soll das programm bei speicherverletzung weiter laufen wegen ausnahmebehandlung. Also ich möchte es so realisieren
    @ helola: Das Program soll den wert ausgebn den die adresse i hat

    Das gibt aber keine exception.
    Darum hat std::vector neben dem ungeprüften []-Operator auch noch eine geprüfte, die exceptions beim unerlaubten Zugriff wirft ( ::at ())



  • verstehe ich nicht. Wie könnte man das denn realisieren, dass die werte aus allen Adresen ausgelsen werden? Also die, auf die man zugrif hat, wenn kein zugriff, dann soll die nächste probiert werden.



  • neoexpert schrieb:

    verstehe ich nicht. Wie könnte man das denn realisieren, dass die werte aus allen Adresen ausgelsen werden? Also die, auf die man zugrif hat, wenn kein zugriff, dann soll die nächste probiert werden.

    Ich glaube du hast ein rießen Designproblem ... 🙄



  • Das ist Betriebssystemspezifisch, je nach BS kann es auch passieren, dass das BS deinen Prozess ohne jegliche Rückmeldung killt, wenn du auf ungültige Adressen zugreifst.
    Um all deinen Speicher durchzuprobieren brauchst du entsprechende Funktionen deines Betriebssystems die dir sagen welche Teile deines Adressraums gültigen Speicher enthalten auf den du zugreifen kannst.



  • Junge Junge schrieb:

    Das ist Betriebssystemspezifisch, je nach BS kann es auch passieren, dass das BS deinen Prozess ohne jegliche Rückmeldung killt, wenn du auf ungültige Adressen zugreifst.
    Um all deinen Speicher durchzuprobieren brauchst du entsprechende Funktionen deines Betriebssystems die dir sagen welche Teile deines Adressraums gültigen Speicher enthalten auf den du zugreifen kannst.

    Wozu braucht man denn so etwas?? Für threads? 😕



  • Wie nachrichtentexter schon sagte verwendest du speicher der (nicht unbedingt) zum Programm gehört.

    In den verschiedenen Schleifendurchläufen nimmt i ja unter anderem die werte 0,1,2 usw an.
    Du machst jetzt den Fehler diese von dir selbst gewählten Zahlen als eine Adresse behandeln zu wollen.
    Doch nur weil eine int-variable den Wert 1 hat, muss sie ja nicht auch die Speicheradresse 1 haben.

    Soll heißen, mit deiner Methode speicherst du nicht die Adresse der zählervariable i, sondern irgendwelche willkürlich gewählten Zahlen die du als Adresse behandelst.

    Aber das soll dich nicht daran hindern die Adresse in Huhu auszugeben, nur darfst du huhu dann natürlich dereferenzieren oO

    verstehe ich nicht. Wie könnte man das denn realisieren, dass die werte aus allen Adresen ausgelsen werden? Also die, auf die man zugrif hat, wenn kein zugriff, dann soll die nächste probiert werden.

    Der Adressoperator lautet "&".
    Selbst wenn du das Programm jetzt jedoch zum laufen kriegst, macht das ganze keinen Sinn oder zu mindest die Schleife, denn von der Variablen i wirst du unabhängig von deren Wert immer die gleiche Adresse erhalten, ist ja immer die gleiche Variable deren Wert du einfach nur änderst.
    Eventuell könnte die sich ändern wenn du das Programm neu startest, doch zur Laufzeit wird sie sich nicht ändern.

    Aus deinem buch oder dem Tutorial das du liest, solltest du dir nochmal das Kapitel über Zeiger näher anschauen, denn wie es scheint hast du da noch ein paar Verständnisprobleme was es mit diesen Zeigern so auf sich hat bzw wie man sie benutzt.



  • Soll heißen, mit deiner Methode speicherst du nicht die Adresse der zählervariable i, sondern irgendwelche willkürlich gewählten Zahlen die du als Adresse behandelst.

    Ja das möchte ich auch. Und natürlich mekert dann das betriebsystem. Würde so ein programm vielleicht unter win95 laufen?

    Selbst wenn du das Programm jetzt jedoch zum laufen kriegst, macht das ganze keinen Sinn oder zu mindest die Schleife, denn von der Variablen i wirst du unabhängig von deren Wert immer die gleiche Adresse erhalten, ist ja immer die gleiche Variable deren Wert du einfach nur änderst.

    das will ich auch nicht, was ich will steht oben. Man muss bevor man die adresse ausliest irgenwie prüfen können ob man die Rechte darauf hat. Dann gehts.

    Aus deinem buch oder dem Tutorial das du liest, solltest du dir nochmal das Kapitel über Zeiger näher anschauen, denn wie es scheint hast du da noch ein paar Verständnisprobleme was es mit diesen Zeigern so auf sich hat bzw wie man sie benutzt.

    Dann guck dir doch mal das mal an:

    //---------------------------------------------------------------------------
    
    #include <iostream.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
            int* huhu;
    
            for(int i=reinterpret_cast<int>(&i);;i++)
            {
                    try
                    {
                            huhu = reinterpret_cast<int*>(i);
                            cout<<huhu<<":\t"<<(char)*huhu<<endl;
                    }
                    catch(...)
                    {
                            continue;
                    }
            }
    }
    //---------------------------------------------------------------------------
    

    Dieses läuft nähmlich. Weil hier die Adresse genommen wird die in einem Adressraum liegt wo man Lesen darf.
    Also es läuft nur solange man rechte hat die adresse zu lesen. Nun möchte ich WENN kein lesezugriff möglich ist, dass die nächste adresse genomen wird usw.



  • Mit Hilfe der WinAPI kann man die Exception-Handler vom OS auf seine eigene umleiten(bitte selber raussuchen, hab das nicht mehr im Kopf wie das genau geht). Wozu dein Vorhaben gut sein soll ist mir trotzdem schleierhaft.
    Und mit dem reinterpret_cast<> sollte man sehr vorsichtig sein.



  • Ich möchte nur mal aus Spaß gucken was im speicher liegt. Ich bin mir sicher, dass wenn man volle Systemrechte hat, man auf den ganzen speicher zugreifen kann. So könnte man vielleicht sogar den Arbeitsspeicherinhalt in eine Datei speichern und ihn analysieren. Naja wenn man das kann, dann ist man in der Welt der unbegrenzten Möglichkeiten.



  • Nein, dass geht garantiert nicht aufgrund der Paging-Einheit, d.h. jeder Prozess hat seine eigenen 4GiB(Win32) großen Speicherraum. Allerdings zeigt davon nur ein Bruchteil auf den Speicher.
    Mit einem Kernel-Treiber hat man vielleicht bessere Karten da man hier mit Supervisorrechten ausgestattet ist. So kann man die Pagedirectories durchkrempeln und anderen Mist anrichten. Naja,wie auch immer.

    Cheers.



  • ja mit "volle Systemrechte" meine ich auch Treiber



  • Den Speicher dumpen kann Windows auch von Haus aus. Und den ganzen Speicher kannst du auch nicht so leicht auslesen. Du musst jedes mal eine Page mappen, unmappen, die nächste holen mappen, unmappen, usw.



  • neoexpert schrieb:

    Naja wenn man das kann, dann ist man in der Welt der unbegrenzten Möglichkeiten.

    Ich weiss nicht, wie du dir das vorstellst, aber an den meisten Orten im Speicher steht sowieso nur Schrott. Ich denke nicht, dass sich der Aufwand lohnen würde...



  • hehe, im speicher ist selten schrott zu fidnen 😉



  • moderne os haben getrennte adressräume für einzelne programme


Anmelden zum Antworten