RAM



  • Original erstellt von paranoiac.org:
    **Ja also komm ich da nicht ran oder wie?
    Also ich weiss ja nicht, aber das kann doch nicht so schwer sein:
    Ich will einfach ein Programm schreiben dass mir den kompletten Arbeitsspeicher von einem best. Programm ausgibt, beispielsweise Notepad.

    Deshalb benötige ich die Startadresse des Programms im Speicher und die Endadresse des Programms im Speicher
    **

    Also wenn du den gesamten Speicher ausgeben willst, gehst du wie ich die ganzen Speicherblöcke ab und gibst alle aus, bei denen Read-Zugriff erlaubt ist (im Fehl mbi.Protect PAGE_READ, PAGE_READWRITE etc.)

    Edit: Startadresse und Endadresse sind ziemlich schwer zu definieren. Ein Programm kann ja durchaus von Windows Speicher anfragen und Windows kann den quer im Speicher verteilen. Außerdem kommen noch DLLs dazu etc. Im allgemeinen sind die Speicherbereiche, die von der EXE-Datei kommen, genauso wie die DLL-Bereiche diejenigen, die mit MEM_IMAGE markiert sind.

    zusätzlich angeforderte Speicherbereiche (seis von EXE oder DLL) sind als MEM_PRIVATE markiert.

    [ Dieser Beitrag wurde am 22.01.2003 um 15:40 Uhr von TriPhoenix editiert. ]



  • Ja wie? Ich muss also wenn ich 2GB RAM hab alles durchlaufen?? Und dann prüfen oder was? Kann ich nicht gezielt nur die Blöcke auslesen, die auch Notepad gehören?

    Achja. Dann bräuchte ich ach kein VirtualQueryEx, da ja ReadProcessMemory sonst eh einen Fehler zurückgibt?!

    [ Dieser Beitrag wurde am 22.01.2003 um 15:40 Uhr von paranoiac.org editiert. ]



  • Original erstellt von paranoiac.org:
    **Ja wie? Ich muss also wenn ich 2GB RAM hab alles durchlaufen?? Und dann prüfen oder was? Kann ich nicht gezielt nur die Blöcke auslesen, die auch Notepad gehören?

    Achja. Dann bräuchte ich ach kein VirtualQueryEx, da ja ReadProcessMemory sonst eh einen Fehler zurückgibt?!

    [ Dieser Beitrag wurde am 22.01.2003 um 15:40 Uhr von [qb]paranoiac.org** editiert. ][/QB]

    Du musst IMMER 2GB ram durchlaufen, weil Windows ja einen virtuellen Adressraum so zur verfügung stellt. Ansonsten s. mein Edit im Post drüber.

    Und ja, dann kannst du eigentlich schon genauso per ReadProcessMemory alles brutal abfragen. Dann aber in 4096-Stücken, da du ja vorher nicht wissen kannst, wie groß die lesbaren Bereiche sind. Und bedenke, dass du auch immer alle DLLs mitdumpst und deren Daten 🙂

    PS: Was Notepad "GEHÖRT" ist ebenso schlecht definierbar. Im Prinzip gehören ihm alle seiten, die als MEM_COMMIT markiert sind.

    [ Dieser Beitrag wurde am 22.01.2003 um 15:43 Uhr von TriPhoenix editiert. ]



  • Das heisst ich durchlaufe von 0x00000000 bis 0x80000000



  • Original erstellt von paranoiac.org:
    Das heisst ich durchlaufe von 0x00000000 bis 0x80000000

    Exakt, weil ab 0x80000000 der Kernelbereich anfängt udn da hat man sowieso nichts zu melden 🙂



  • Habs jetzt so.
    Das müsste doch den Speicher der Notepad gehört auspucken oder?
    Weil nur bei den Blöcken die Notepad gehören ist Read....() erfolgreich odeR?

    #include <stdio.h>
    #include <windows.h>
    
    int main()
    {
        HWND            hWnd;
      HANDLE        hProc;
      DWORD         dwProcID;
      DWORD         dwRw = 0;
    
      unsigned  sadress = 0x00000000;
      unsigned  eadress = 0x80000000;
      int               buffer  = 0;
      long              iBytes2Read ;
    
      long iBytes;
    
      // find notepad
      hWnd = FindWindow(0, "Unbenannt - Editor");
      if(!hWnd)
        return 0;
    
        // get process id
        GetWindowThreadProcessId(hWnd, &dwProcID);
    
        // open process
        hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID);
    
        // get bytes to read
        printf("Wieviele Bytes auslesen: ");
        scanf("%d", &iBytes2Read);
        printf("\n");
    
        iBytes=0;
    
        iBytes2Read = 0x80000000;
    
        while(iBytes2Read--){
            if(ReadProcessMemory(hProc,(LPCVOID)sadress,&buffer, sizeof(buffer),&dwProcID)){
                iBytes++;
                if(buffer<127 && buffer>31)
                    printf("%c", buffer);           
            }
        sadress++;
        }
        printf("\n\nFertig!");
    
        // close handle
        CloseHandle(hProc);//<-- Wichtig!
    
        // quit
        fflush(stdin);
        getchar();
      return 0;
    }
    


  • fflush(stdin);

    Das ist verboten



  • wieso das denn??



  • Original erstellt von <Offtopic>:
    **fflush(stdin);

    Das ist verboten**

    Nihct verboten, das Verhalten auf input-Streams ist nur undefiniert 🙂 Und in der MSDN wirds benutzt, ist also unter Windows sehr wohl von M$ definiert worden



  • fflush ist nur auf stdout definiert. auf stdin == undefiniertes verhalten



  • Original erstellt von paranoiac.org:
    **Habs jetzt so.
    Das müsste doch den Speicher der Notepad gehört auspucken oder?
    Weil nur bei den Blöcken die Notepad gehören ist Read....() erfolgreich odeR?
    **

    Sieht vernünftig aus....ist nu nicht gerade das schnellste 😉



  • MMmh, wie geht es denn schneller?
    Brauche so für 0x00000000 bis 0x01000000 57 Sekunden

    [ Dieser Beitrag wurde am 22.01.2003 um 15:56 Uhr von paranoiac.org editiert. ]



  • Original erstellt von paranoiac.org:
    **MMmh, wie geht es denn schneller?
    Brauche so für 0x00000000 bis 0x01000000 57 Sekunden
    **

    Lies in 4096er-Blöcken (Eine Speicherseite), solange es geht. Also mach dienen Buffer z.B. so:
    unsigned char buffer[4096];

    dann musst du halt deine while-Schleife so modifizieren, dass sie 4096er-Blöcke rechnet.



  • char buffer[4097];



  • Ok, aber ist deine vorherige Methode mit VirtualQueryEx nicht schneller?
    Oder hab ich da jetzt was ganz falsch verstanden 😕



  • Original erstellt von paranoiac.org:
    Ok, aber ist deine vorherige Methode mit VirtualQueryEx nicht schneller?
    Oder hab ich da jetzt was ganz falsch verstanden 😕

    Vermutlich, da du Blöcke die nicht existieren garnicht erst anfasst und dir damit nen Haufen fehlerhafte Aufrufe sparst. Denn reeall ist bei Notepad z.B. ja wie du sagtest nur 2MB belegt, während man 2GB abscannt. per VirtualQueryEx bekommst du von vornerein nur die gültigen Bereiche. Das macht das Programm wzar einen Tick komplizierter, aber wesentlich schöner



  • Ok, lönntest du mir dann vielleicht ein wenig helfen?
    Ich möchte einfach wenn ich einen String in Notepad eintippe "HALLO" zum Beispiel die Adresse dieses Strings ausgeben können



  • Original erstellt von <++>:
    char buffer[4097];

    Wozu? Ne vernünftieg Ausgabe muss dazu sowieso neu geschrieben werden, es sei denn man mags, wenn der Rechner vor piepen nicht mehr kann 😉



  • Original erstellt von TriPhoenix:
    Wozu? Ne vernünftieg Ausgabe muss dazu sowieso neu geschrieben werden, es sei denn man mags, wenn der Rechner vor piepen nicht mehr kann 😉

    Wie bekomme ich das Pipen eigentlich weg?



  • garnicht? wer das an der konsole ausgibt ist dumm :p


Anmelden zum Antworten