Question

Je suis en train de lire une mémoire de processus en utilisant le code suivant:

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

Maintenant, pHandle et paddress sont connus becuase je WriteProcessMemory. Je les valeurs à partir de là. datasize est également connu.

La fonction fonctionne bien, sauf pour ce qui suit. ReadProcessMemory () retourne dataread = 41 (ce qui est correct, je suis passé de 41 à DataSize), mais la longueur réelle du buff est 49. lorsque j'imprime buff-je obtenir ma chaîne + des ordures.

Qu'est-ce que je fais mal?

code est apprécié.

Merci!

Était-ce utile?

La solution

Le « \ 0 » à la fin de votre chaîne est probablement pas en cours de copie, soit de votre tampon lorsque vous écrivez, ou dans votre tampon lorsque vous lisez. En conséquence, printf () va tout simplement imprimer à partir du début de votre chaîne jusqu'à ce qu'elle voit un « \ 0 », qui peut être après un certain nombre de caractères d'ordures.

Autres conseils

Savez-vous que les données que vous lisez est une chaîne? C'est à dire. qu'il est nulle fin? Sinon, à l'aide strlen () est garantie peu fiables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top