RAM



  • 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



  • Muss aber irgentwie wegzubekommen sein.



  • nein



  • / set end address
      adrEnd = 0x01000000;
    
      // begin
        for(; adrStart<adrEnd; adrStart+=4096){      
            // get some info
            VirtualQueryEx(hProc, (LPCVOID)adrStart,    lpBuffer,   4096);
    
            // state
            printf("%X - %X\n", adrStart, adrStart+4096);
    
            /*if(ReadProcessMemory(hProc,(LPCVOID)adrStart,&buffer, sizeof(buffer),&dwProcID)){
            }*/
        }
    

    Wie bekomme ich jetzt aus der Struktur die Information, ob der Speicher für mich "einsehbar" ist?

    cu para
    😃



  • *schieb*
    Wie hast du das mit deinem Programm am Anfang da gemacht, dass du wusstest ob es ein COMMIT-Bereich war?



  • Wie kannst du nach 15 Minuten schon schieben? Das ist ja ne mega Frechheit. 😡



  • Original erstellt von <Pullmol>:
    Wie kannst du nach 15 Minuten schon schieben? Das ist ja ne mega Frechheit. 😡

    LMAA
    [edit]OT: Auserdem enthält mein frecher "schiebe-post" auch eine Frage[/edit]

    [ Dieser Beitrag wurde am 22.01.2003 um 18:22 Uhr von paranoiac.org editiert. ]



  • Also ich hoffe es nimmt mir jetzt keiner Übel, wenn ich nocheinmal frag:
    Ich schaffe es jetzt alle Speicherblöcke durchzugehen und es dauert auch nur 500ms. Aber wie prüfe ich jetzt ob ich darin auch schreiben/lesen kann.
    Also wie bist du auf das gekommen:

    0x00010000 - 0x00011000  RW-               RW-               COMMIT   PRIVATE
    

    Soweit ich weiss muss ich auf MEM_COMMIT prüfen (oder noch mehr?).

    Normalerweise benutze ich VC++ aber ich benutze gerade DevC++

    Hier mein Code:

    #include <stdio.h>
    #include <windows.h>
    
    int main()
    {
        HWND                        hWnd;
      HANDLE                    hProc;
      DWORD                     dwProcID;
      DWORD                     dwRw = 0;  
      unsigned              adrStart    = 0x00000000;
      unsigned              adrEnd      = 0x80000000;
      unsigned char     buffer[4096];
      unsigned long                     iBytesRead=0;
    
      // find notepad
      hWnd = FindWindow(0, "Unbenannt - Editor");
      if(!hWnd)
        return 0;
    
        // get process id
        GetWindowThreadProcessId(hWnd, &dwProcID);
        PMEMORY_BASIC_INFORMATION mbi;
    
        // open process
        hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID);
    
        // start stopping
      DWORD st=GetTickCount();
    
      // set end address
      adrEnd = 0x80000000;
    
      // begin
        for(; adrStart<adrEnd; adrStart+=4096){      
            // get some info
            VirtualQueryEx(hProc, (LPCVOID)adrStart,    mbi,    4096);
    
            // state
            // printf("%X - %X\n", adrStart, adrStart+4096);
            if(mbi.State==MEM_COMMIT){
                if(ReadProcessMemory(hProc,(LPCVOID)adrStart,&buffer, sizeof(buffer),&dwProcID)){
    
                }
            }
    
            // state
            iBytesRead+=4096;
        }
    
        // stop stopping
        printf("\n\nFinihed! %d MiliSek.\n%d KBytes searched", (GetTickCount()-st), iBytesRead/(1024));
    
        // close handle
        CloseHandle(hProc);//<-- Wichtig!
    
        // quit
        fflush(stdin);
        getchar();
      return 0;
    }
    

    Bei if(mbi.State==MEM_COMMIT)... bekomme ich diesen Fehler:

    40 C:\Dokumente und Einstellungen\Administrator\Desktop\ramtest.cpp
    request for member `State' in `mbi', which is of non-aggregate type `_MEMORY_BASIC_INFORMATION *'
    

    Was bedeutet das?

    Hoffe es kann mir jemand helfen
    danke!
    cu para
    🙄



  • Original erstellt von paranoiac.org:
    *schieb*
    Wie hast du das mit deinem Programm am Anfang da gemacht, dass du wusstest ob es ein COMMIT-Bereich war?

    Also mein Programm macht das so:

    switch (mbi.State) {
        case MEM_COMMIT:
          printf("COMMIT   ");
          break;
        case MEM_FREE:
          printf("FREE     ");
          break;
        case MEM_RESERVE:
          printf("RESERVED ");
          break;
        default:
          printf("???????? ");
          break;
        }
    

    Von daher solle es ein if(mbi.State == MEM_COMMIT) eigentlich tun...mein gcc 3.2 gibt die Meldung nnicht aus wie den Dev-C++...werds nochmal mit gcc checken...

    Nachtrag: Also dien Programm kompiliert mitm gcc 3.2 durch, Interessanterweise nicht im MMSVC-Compiler....

    [ Dieser Beitrag wurde am 22.01.2003 um 18:41 Uhr von TriPhoenix editiert. ]



  • MOOOOMENT...du hast da nicht mehr eine MEMORY_BASIC_INFORMATION sondern PMEMORY_BASIC_INFORMATION. Dui willst doch keinen Zeiger haben, oder? mach mal das P wieder weg 😉 Alternativ alloziiere auch Speicher dafür. Dann kannst du per mbi->State zugreifen



  • Jo danke! Das mit dem COMMIT funzt jetzt, aber irgentwie hab ich jetzt nur noch irgentwelche doofen Smilies.



  • #include <stdio.h>
    #include <windows.h>
    
    #define BLOCKSIZE                       4096/1
    
    int main()
    {
        HWND                                            hWnd;
      HANDLE                                        hProc;
      DWORD                                         dwProcID;
      DWORD                                         dwRw = 0;  
      unsigned                                  adrStart    = 0x00000000;
      unsigned                                  adrEnd      = 0x80000000;
      unsigned char                         buffer[BLOCKSIZE];
      unsigned long                         iBytesRead=0;
      MEMORY_BASIC_INFORMATION  mbi;
      // 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);
    
        // start stopping
      DWORD st=GetTickCount();
    
      // begin
        for(; adrStart<adrEnd; adrStart+=BLOCKSIZE){         
            // get some info
            VirtualQueryEx(hProc, (LPCVOID)adrStart,    &mbi,   BLOCKSIZE);
    
            if(mbi.State==MEM_COMMIT){
                if(ReadProcessMemory(hProc,(LPCVOID)adrStart,&buffer, sizeof(buffer),&dwProcID)){
                    printf("%X - %X => %s\n", adrStart, adrStart+BLOCKSIZE, buffer); 
    
            // state
            iBytesRead+=BLOCKSIZE;          
                }
            }
    
        }
    
        // stop stopping
        printf("\n\nFinihed! %d MiliSek.\n%d,%d MBytes searched", (GetTickCount()-st), iBytesRead/(1024*1024), iBytesRead%(1024*1024));
    
        // close handle
        CloseHandle(hProc);//<-- Wichtig!
    
        // quit
        fflush(stdin);
        getchar();
      return 0;
    }
    

    So, nun wenn ich aber doch jetzt in Notepad etwas schreibe dann sollte doch irgentwo auch dieser Text in der Ausgabe meines Programms vorkommen.
    Kann es an der BLOCKSIZE liegen??
    Nach einer Weile kommen nämlich nur noch wirre Sachen

    cu para
    😃


Anmelden zum Antworten