PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prozessspeicher auslesen



SleiZer
29.07.2009, 01:15
Also ich will den Speicher eines Prozesses auslesen und verarbeiten.
Code von EBFE (http://free-hack.com/member.php?u=55471):

#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/library/aa366907%28VS.85%29.aspx verwerden.
Mein 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?

G36KV
29.07.2009, 10:12
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 (http://msdn.microsoft.com/en-us/library/ms684880%28VS.85%29.aspx).

SleiZer
29.07.2009, 10:29
Ah, dann müsste das so aussehn.

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

G36KV
29.07.2009, 11:39
stimmt überhaupt deine process id? welchen wert liefert virtualqueryex zurück?
Wo genau kommt die access violation? benutzt einen debugger

SleiZer
29.07.2009, 12:48
Also die Processid stimmt ...
Aber das virtualqueryex gibt eine 0 zurück ...
Der Access Violation kommt von der Ausgabe

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?

G36KV
29.07.2009, 13:19
hier gibts einen schönen tutorial:

http://www.online-tutorials.net/security/speicherzugriff-tutorial-teil-2/tutorials-t-27-69.html

l0dsb
29.07.2009, 13:59
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.


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.

SleiZer
29.07.2009, 14:58
Das zweite eine Adresse in der Page

Was hat es damit auf sich? Soll es einfach irgendeine Addresse im Speicherbereich sein?

MEMORY_BASIC_INFORMATION range;
status =VirtualQueryEx(pressid,(void*)0x400000, &range, sizeof(range));

Ich lasse mir das range ausgeben:

Status: 28
AllocationBase: 4194304
AllocationProtect: 128
BaseAddress: 4194304
Protect: 2
RegionSize: 4096
State: 4096
Type: 16777216
kann mir jemand sagen was es mir sagt?

l0dsb
29.07.2009, 18:42
MSDN (http://msdn.microsoft.com/en-us/library/aa366775(VS.85).aspx) kann, ja.

SleiZer
29.07.2009, 21:15
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?

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.RegionSi ze;
}else{
dump((void*)PROCESS_ID_MANUAL(void*)range.BaseAddr ess,range.RegionSize);
startip=startip+range.RegionSize;
}
}
Dabei bekommen ich

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?