arbeitsspeicher auslesen



  • hallo.
    ich hab heute versucht meinen arbeitsspeicher auszulesen.
    dazu hab ich versucht die in einem zeiger gespeicherte adresse auf 0 zu setzen und dann mit hilfe einer schleife um jeweils 1 erhöhen und ausgeben.
    das ich die adresse verändere klapt ausgezeichnet nur leider kann ich nicht auf die werte, die an dieser stelle gespeichert sind, zu greifen und auslesen.

    kann mir mal einer ne kleine funktion oder nen denkanstoß geben wie ich meinen gesamten arbeitsspeicher auslese? danke.



  • Wenn du unter Windows arbeitest, wird das wohl ein Ding der Unmöglichkeit, da hier die jede Anwendung ihren eigenen Speicherbereich zugewiesen bekommt, der gegen äussere Zugriffe geschützt ist! Du kannst es aber trotzdem versuchen und dein Prozessor in den Flat Modus schalten:

    jmp flat
                  ;Global Descriptor Table
    GDT dw $ffff  ; Segmentlänge Lowword
        dw $0000  
        db $00    ; physikalische Adresse 24Bit (segement beginnt bei 0)
        db $92    ; Zugriffsrechte (Alle Zugriffsrechte)
        dw $ffcf  ; Segmentlänge HiWord
    flat:
        mov GDT[0], 16   ; GDT anpassen und laden
        mov eax, cs
        shl eax, 4
        mov bx, offset GDT
        movzx ebx, bx
        add eax,ebx
        mov dword ptr GDT[2], eax
        lgdt pword ptr GDT  ; GDT laden
    
        mov bx, 8    ; bx zeigt auf ersten Eintrag der GDT
        push ds      ; DS auf Stack
        cli          ; Interrupts aus
        mov eax, cr0 ; Control Register 0 nach eax
        or eax, 1    ; Protected Mode Bit setzen
        mov cr0, eax ; und zurückschreiben
        jmp pm       ; Execution Pipe des Prozessors mit einem Jump leeren
      pm:            ; Jetzt sind wir im Protected Mode
        mov gs, bx   ; Segmentregister auf 4GB anpassen
        mov fs, bx
        mov es, bx
        mov ds, bx
        and al, $fe  ; Protected Mode Bit löschen
        mov cr0, eax ; nach Control Register
        jmp rm       ; wieder Execution Pipe löschen
    rm:              ; zurück im Real-Mode
        sti          ; Interupts wieder zulassen
        pop ds       ; DS vom Stack holen
        ret          ; fertig !
    

    Jetzt kannst du (theoretisch) deinen Speicher linear auslesen, indem du in ebx die Adresse (absolute) schreibst und mit

    mov al, gs:[ebx]
    

    ausliest. Viel Erfolg!!

    [ Dieser Beitrag wurde am 16.11.2002 um 21:24 Uhr von ºgrimmsenº® editiert. ]



  • Kannst diesen Quellen code mit kommentaren ausrüsten , oder ist es schwer zu beschreiben ?

    cu..



  • Gut so?



  • ja ich arbeite unter win 98.
    aber bitte verate mir mal was du da geschrieben hast und welche header ich dazu einbinden muss.
    das ganze sieht doch etwas sehr merkwürdig aus.



  • Das ist Assembler. Kannst du unter C auch benutzen:

    asm { ..Assembleranweisungen.. }
    

    statt den Dollarzeichen vor den Hexzahlen musst du 0x0.... schreiben.



  • ja das hab ich mir schon fast gedacht.
    ich suche aber ne richtige c++ lösung. *g*
    aber danke erstmal ich werds mal ausprobieren.



  • In reinem C++ wirst du da aber leider hübsch wenig finden...

    MfG SideWinder


Anmelden zum Antworten