2009-08-20 15 views
1

Ich versuche, einen Prozess-Speicher mit dem folgenden Code zu lesen:Readprocessmemory gibt einen größeren Puffer (C, Fenster)

void readdata(HANDLE phandle, LPCVOID paddress, SIZE_T datasize) 
{ 
    char *buff; 
    SIZE_T dataread; 
    BOOL b = FALSE; 

    buff = (char *) malloc (datasize); 

    b = ReadProcessMemory(phandle, paddress, (LPVOID)buff, datasize, &dataread); 
    if(!b) 
    { 
     printf("error reading memory, err = %d\n", GetLastError()); 
     return; 
    } 

    printf("Data Read    = %d\n", dataread); 
    printf("Len of actual buffer = %d\n", strlen(buff)); 
    printf("Data = %s\n", buff); 

    free(buff); 
    return; 
} 

Nun phandle und pAddress sind dafür bekannt, weil ich Write verwendet. Ich habe die Werte von dort. Datengröße ist auch bekannt.

Die Funktion funktioniert bis auf die folgenden Ausnahmen. ReadProcessMemory() gibt data_read = 41 zurück (was korrekt ist, ich habe 41 an datasize übergeben), aber die tatsächliche Länge des Buffs ist 49. Wenn ich buff drucke, bekomme ich meine Zeichenfolge + etwas Müll.

Was mache ich falsch?

Code wird geschätzt.

Danke!

Antwort

2

Das '\ 0' am Ende der Zeichenfolge wird wahrscheinlich nicht kopiert, weder beim Schreiben aus dem Puffer noch beim Lesen in den Puffer. Als Ergebnis wird printf() nur vom Anfang der Zeichenfolge bis zu einem '\ 0' gedruckt, das möglicherweise hinter einer Anzahl von ungültigen Zeichen steht.

+0

OK, wie würde ich das beheben (wenn das der Fall ist)? Ich schreibe die Zeichenfolge dort selbst. die Zeichenkette ist (zum Testen): "<1234567890><1234567890> \ 0" – wonderer

+0

Schreiben Sie Strlen (String) Bytes? Wenn dies der Fall ist, enthält strlen() das '\ 0' nicht, also müssen Sie eins zur Zählung hinzufügen. – Jonathan

+0

haben es geschafft. Vielen Dank! – wonderer

1

Wissen Sie, dass die Daten, die Sie lesen, eine Zeichenfolge sind? Ie. dass es null terminiert ist? Wenn nicht, ist die Verwendung von strlen() garantiert unzuverlässig.

+0

Ja, es ist eine Zeichenfolge. Ich lege es dort (einschließlich der NULL Char am Ende) – wonderer

+0

Sie setzen ** Strlen() + 1 ** Bytes? Dann, tut mir leid, GUV, keine Ahnung. – djna

Verwandte Themen