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

标签 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。我有那里的值(value)观。数据大小也是已知的。

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

我做错了什么?

感谢代码。

谢谢!

最佳答案

字符串末尾的 '\0' 可能没有被复制,要么在您写入时从缓冲区中复制出来,要么在您读取时复制到缓冲区中。因此,printf() 只会从字符串的开头开始打印,直到它看到一个 '\0',它可能在一些垃圾字符之后。

关于c - ReadProcessMemory 返回一个更大的缓冲区(C,windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1306388/

相关文章:

c# - 如何向Windows任务栏添加内容

C++ MFC 属性并获取选中的子项

ruby - 在 Ruby 中,如何从外部进程读取内存值?

c - 如何制作接受不同类型的函数?

c - 在 Linux 编程中通过管道在进程之间发送链表结构的最佳方法是什么

c - 为什么 strptime() 在 OSX 和 Linux 上表现不同?

windows - 是否有适用于 Windows 的预建 clang 库?

c - 如何创建对数字求和的递归函数?

c++指针操作等同于ReadProcessMemory

c++ - 读取进程的进程内存不会返回所有内容