将单个HANDLE与两次ReadProcessMemory调用一起使用时的无效句柄

时间:2018-08-19 12:26:44

标签: c handle readprocessmemory openprocess

我才刚刚开始学习Windows API,我想编写一个简单的程序来读取给定过程中的值。

这是我的代码

#include <stdio.h>
#include <Windows.h> 

void printError();

int main()
{
    int *buffer;

    // process input
    unsigned int pid = 0;
    printf("process ID : ");
    scanf("%d", &pid);
    getchar();
    HANDLE authorisation = OpenProcess(PROCESS_VM_READ, FALSE, pid);
    if(authorisation == NULL)
    {
        printf("OpenProcess Failed. GetLastError = %d", GetLastError());
        getchar();
        return EXIT_FAILURE;
    }   

    // adress memory input
    int *memoryAddress = 0x0;
    printf("memory address to read (in hexadecimal) : ");
    scanf("%p", &memoryAddress);
    getchar();
    printf("Reading from address : %p", memoryAddress);
    if(ReadProcessMemory(authorisation, (LPCVOID)memoryAddress, &buffer, 8, 
    NULL))
    {
        printf("\nptr2int = %p\n", buffer);
    }
    else
    {
        printError();    
    }

    int varInt = 0;
    // HERE IS THE PROBLEM
    // GetLastError return 6 : Invalid Handle 
    if(ReadProcessMemory(authorisation, (LPCVOID)buffer, &varInt, 
    sizeof(int), NULL))
    {
        printf("varInt = %d\n", varInt);
    }
    else
    {
        printError();
    }

    printf("Press ENTER to quit");
    getchar();

    return 0; 
}

void printError()
{
    printf("ReadProcessMemory Failed. GetLastError = %d", GetLastError());
    getchar();
    return EXIT_FAILURE;
}

但是,如果我为RPM的第二次调用创建了一个新的Handle,则它工作正常。

我在MSDN上阅读过此内容

  

OpenProcess函数返回的句柄可以在任何   需要处理的功能”

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您的问题是这个

int *buffer;
unsigned int pid = 0;

ReadProcessMemory(authorisation, (LPCVOID)memoryAddress, &buffer, 8, NULL);

让我们说,因为您正在编译32位应用程序且指针为4个字节,所以缓冲区的地址为0x0,而pid的地址为0x4。调用RPM时,您会硬编码8个字节的大小,这会覆盖pid使其无效。您基本上是缓冲区溢出自己。

每当使用ReadProcessMemory()时,都应始终将sizeof(originalVariable)用作字节数参数,这样就永远不会出现任何问题。

如果您打算经常访问其他进程的内存,则应遵循以下做法:

使用uintptr_t存储地址,然后编译您的应用程序以匹配目标进程的体系结构。当为x64编译时,它将是8个字节,而在x86上,它将是4个字节。您也可以根据需要创建自己的typedef。

针对目标过程的相同体系结构进行编译在许多方面都很有帮助,您会在旅途中发现,有几种WINAPI可以更轻松地使用此方法。您不必这样做,但我强烈建议。