Domanda

Sto cercando di leggere una memoria di processo utilizzando il seguente codice:

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;
}

Ora, phandle e Paddress sono noti becuase ho usato WriteProcessMemory. Ho i valori da lì. datasize è anche noto.

La funzione funziona bene, tranne che per quanto segue. ReadProcessMemory () restituisce dataread = 41 (che è corretto, sono passato da 41 a DataSize), ma la lunghezza effettiva del buff è 49. quando stampo appassionato ricevo la mia stringa + della spazzatura.

Che cosa sto facendo di sbagliato?

codice è apprezzato.

Grazie!

È stato utile?

Soluzione

Il '\ 0' alla fine della stringa non è probabile la copia, o dal vostro buffer quando si scrive, o nel vostro buffer quando si legge. Di conseguenza, printf () è solo andare a stampare dall'inizio della stringa fino a quando non vede un '\ 0', che può essere dopo un certo numero di caratteri privi di significato.

Altri suggerimenti

Lo sai che i dati letti è una stringa? Vale a dire. che è nullo terminata? Se poi non utilizza strlen () è garantito per essere inaffidabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top