Ergebnis 1 bis 10 von 10
  1. #1
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard Prozessspeicher auslesen

    Also ich will den Speicher eines Prozesses auslesen und verarbeiten.
    Code von EBFE:
    Code:
    #include <windows.h>
    #include <stdio.h>
    #define PROCESS_ID_MANUAL 1168
    
    int dump(void* hProcess,void *base,int size)
    {
      unsigned char* buff= malloc(size);
      int bytes=0;
      
      int result=ReadProcessMemory(hProcess,base,buff,size,&bytes);
      if (result!=0)  
              printf("konnte 0x%X Bytes einlesen von 0x%0.8X\n",bytes,base);
      else 
      {
         printf("konnte 0x%0.8X NICHT auslesen\n",base);
         free(buff);
         return 0;
      }
      
        int i;
        for (i=1;i<bytes-1 && i<size-1;i++)
        {
           printf("%0.2X ",buff[i-1]);
           if ((i%16==0)) printf("\n"); /*Zeilenumbruch alle 16 Bytes*/
        }
        free(buff);
        return 0;
    }
    int main()
    { 
        unsigned char puffer[256];
        void *pressid;
        void *startip;
        pressid= OpenProcess(PROCESS_VM_READ,1,PROCESS_ID_MANUAL);
        dump(pressid,(void*)0x1000,50);
        dump(pressid,(void*)0x400000,50);
        dump (pressid,(void*)0x600000,50);
        dump (pressid,(void*)0x80000000,50); /*sollte nix ausgeben,
        da OS reserviert*/
        return 0;
    }
    Nun möchte ich den ganzen vom Programm belegte Speicher auslesen, dafür will ich die Funktion VirtualQueryEx http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx verwerden.
    Mein code:
    Code:
    struct _MEMORY_BASIC_INFORMATION *rage;
    pressid = OpenProcess(PROCESS_VM_READ,1,PROCESS_ID_MANUAL);
    VirtualQueryEx(pressid,0,rage,100);
    printf("%d", rage->BaseAddress);
    gibt mir ein Access Violation zurück ...
    warum?

  2. #2
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    jetzt hast du da so schön den msdn link rausgefunden, jetzt musst du ihn nur noch lesen können:

    A handle to the process whose memory information is queried. The handle must have been opened with the PROCESS_QUERY_INFORMATION access right, which enables using the handle to read information from the process object. For more information, see Process Security and Access Rights.

  3. #3
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    Ah, dann müsste das so aussehn.
    Code:
    struct _MEMORY_BASIC_INFORMATION *rage;
    pressid = OpenProcess(PROCESS_QUERY_INFORMATION,1,PROCESS_ID_MANUAL);
    VirtualQueryEx(pressid,0,rage,100);
    printf("%d", rage->BaseAddress);
    aber leider weiterhin ein Access violation

  4. #4
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    stimmt überhaupt deine process id? welchen wert liefert virtualqueryex zurück?
    Wo genau kommt die access violation? benutzt einen debugger

  5. #5
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    Also die Processid stimmt ...
    Aber das virtualqueryex gibt eine 0 zurück ...
    Der Access Violation kommt von der Ausgabe
    Code:
    printf("%d", rage->BaseAddress);
    was wohl heißt, dass virtualqueryex keine daten bekommt und somit
    auch nix aus dem rage ausgelesen werden kann?! Aber warum kriegt der keine Daten?

  6. #6
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    hier gibts einen schönen tutorial:

    http://www.online-tutorials.net/secu...s-t-27-69.html

  7. #7
    I'm in ur VM. Avatar von l0dsb
    Registriert seit
    23.07.2007
    Beiträge
    1.038

    Standard

    Nur, weil die Funktion einen Pointer erwartet, heißt das nicht, dass du einen Pointer deklarieren sollst. Der Pointer soll auf eine Struktur zeigen (also realen Speicher), die die Informationen über eine Page liefert, in der die angegebene Adresse (bei dir 0, das wird nicht funktionieren, da diese nicht im gültigen Adressbereich liegt und somit dort keine Page existieren kann) liegt.

    Code:
    MEMORY_BASIC_INFORMATION Range;
    VirtualQueryEx(ProcessId, &WinMain, &Range, sizeof(Range));
    Range ist eine konkrete Struktur, nicht bloß ein Pointer, der in's Leere zeigt. Das zweite eine Adresse in der Page (ich habe mal aus Testzwecken meine WinMain genommen, da ich den eigenen Prozess auslese), dann der Pointer auf deine Ausgabestruktur und zum Schluss die Größe ebenjener.
    I can haz RCE?

  8. #8
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    Zitat Zitat von ;X Beitrag anzeigen
    Das zweite eine Adresse in der Page
    Was hat es damit auf sich? Soll es einfach irgendeine Addresse im Speicherbereich sein?
    Code:
    MEMORY_BASIC_INFORMATION range;
    status =VirtualQueryEx(pressid,(void*)0x400000, &range, sizeof(range));
    Ich lasse mir das range ausgeben:
    Code:
    Status: 28
    AllocationBase: 4194304
    AllocationProtect: 128
    BaseAddress: 4194304
    Protect: 2
    RegionSize: 4096
    State: 4096
    Type: 16777216
    kann mir jemand sagen was es mir sagt?

  9. #9
    I'm in ur VM. Avatar von l0dsb
    Registriert seit
    23.07.2007
    Beiträge
    1.038

    Standard

    MSDN kann, ja.
    I can haz RCE?

  10. #10
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    Also ich suche mir jetzt lesebare Bereiche raus..
    fange mit der Addresse 0x01 an und jedesmal wenn ich entweder
    0x01(PAGE_NOACCESS) oder 0x00(NOACCESS) wieder bekomme
    gehe ich zur nächsten über, indem ich die alte Addresse + der Pagegröße nehme.
    Soweit richtig?
    Code:
    int startip=0x0001;
    status =VirtualQueryEx(pressid,(void*)startip, &range, sizeof(range));
        while(status != 0){
        status =VirtualQueryEx(pressid,(void*)startip, &range, sizeof(range));
        if((range.Protect == 0x01) || (range.Protect == 0x00))
        {
            ((int*)(startip))=((int*)(startip))+range.RegionSize;
        }else{
     dump((void*)PROCESS_ID_MANUAL(void*)range.BaseAddress,range.RegionSize);
     startip=startip+range.RegionSize;
        }
        }
    Dabei bekommen ich
    Code:
    konnte 0x00040000 NICHT auslesen
    Status: 0x1C
    AllocationBase: 0x40000
    AllocationProtect: 0x80
    BaseAddress: 0x40000
    Protect: 0x02
    RegionSize: 0x1000
    State: 0x1000
    Type: 0x1000000
    ---------------
    konnte 0x00081000 NICHT auslesen
    Status: 0x1C
    AllocationBase: 0x50000
    AllocationProtect: 0x04
    BaseAddress: 0x81000
    Protect: 0x04
    RegionSize: 0xF000
    State: 0x1000
    Type: 0x20000
    ---------------
    konnte 0x004E4000 NICHT auslesen
    Status: 0x1C
    AllocationBase: 0x4E0000
    AllocationProtect: 0x04
    BaseAddress: 0x4E4000
    Protect: 0x04
    RegionSize: 0xFC000
    State: 0x1000
    Type: 0x20000
    ---------------
    konnte 0x005E0000 NICHT auslesen
    Status: 0x1C
    AllocationBase: 0x5E0000
    AllocationProtect: 0x04
    BaseAddress: 0x5E0000
    Protect: 0x04
    RegionSize: 0x1000
    State: 0x1000
    Type: 0x20000
    ---------------
    zurück.
    Sehe ich das richtig, dass der erste Block quasi der ProzessBlock ist und der rest freie Blöcke für Dynamischen Speicher?
    Aber warum hat die dupe Funktion danach schwierigkeiten?

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •