ReadProcessMemory返回一个更大的缓冲区(C,windows)

时间:2009-08-20 13:58:46

标签: c windows readprocessmemory

我正在尝试使用以下代码读取进程内存:

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

现在,phandle和paddress是已知的,因为我使用了WriteProcessMemory。我有那里的价值观。 datasize也是众所周知的。

该功能正常,但以下情况除外。 ReadProcessMemory()返回dataread = 41(这是正确的,我将41传递给datasize)但buff的实际长度是49.当我打印buff时,我得到我的字符串+一些垃圾。

我做错了什么?

代码表示赞赏。

谢谢!

2 个答案:

答案 0 :(得分:2)

字符串末尾的'\ 0'可能不会被复制,无论是在写入时是从缓冲区中复制出来,还是在读取时都被复制到缓冲区中。因此,printf()只是从字符串的开头打印,直到它看到'\ 0',这可能是在一些垃圾字符之后。

答案 1 :(得分:1)

你知道你读的数据是字符串吗? IE浏览器。它被终止了吗?如果没有,则保证使用strlen()不可靠。