【问题标题】:ReadProcessMemory returns a larger buffer (C, windows)ReadProcessMemory 返回更大的缓冲区(C,windows)
【发布时间】:2009-08-20 13:58:45
【问题描述】:

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

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。我有从那里的价值观。数据大小也是已知的。

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

我做错了什么?

代码表示赞赏。

谢谢!

【问题讨论】:

    标签: c windows readprocessmemory


    【解决方案1】:

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

    【讨论】:

    • 好的,我将如何解决这个问题(如果是这种情况)?我自己在那里写字符串。字符串是(用于测试):“ \0”
    • 你在写 strlen(string) 字节吗?如果是这样,strlen() 不包括 '\0',因此您需要在此处的计数中加一。
    【解决方案2】:

    你知道你读取的数据是一个字符串吗? IE。它是空终止的吗?如果不是,那么使用 strlen() 肯定是不可靠的。

    【讨论】:

    • 是的,它是一个字符串。我把它放在那里(包括最后的 NULL 字符)
    • 你放了 strlen() + 1 个字节?那么,对不起,老大,不知道。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2021-06-04
    • 2012-11-23
    相关资源
    最近更新 更多