简言:
ReadProcessMemory函数是 Windows API 中的一个函数,用于从目标进程的虚拟内存空间中读取数据。这个函数非常有用,尤其是在进行内存分析、调试、或某些类型的逆向工程时。
ReadProcessMemory函数
函数原型
cpp
BOOL ReadProcessMemory(
HANDLE hProcess, // 目标进程的句柄
LPCVOID lpBaseAddress, // 要读取的内存的起始地址
LPVOID lpBuffer, // 存储读取数据的缓冲区
SIZE_T nSize, // 要读取的字节数
SIZE_T* lpNumberOfBytesRead // 实际读取的字节数
);
参数说明
-
hProcess : 目标进程的句柄。你必须具有
PROCESS_VM_READ
权限才能成功读取目标进程的内存。你可以通过OpenProcess
函数打开进程并获取句柄。 -
lpBaseAddress: 目标进程内存空间中的起始地址,表示你希望从该位置开始读取数据。可以是任何有效的内存地址。
-
lpBuffer: 指向一个缓冲区的指针,用来存储从目标进程内存中读取的数据。你必须确保该缓冲区足够大,以容纳你指定的读取大小。
-
nSize: 要读取的字节数,指定希望从目标进程的内存中读取多少字节的数据。
-
lpNumberOfBytesRead : 可选参数,如果不为
NULL
,它将返回实际读取的字节数。如果读取的字节数小于请求的字节数,lpNumberOfBytesRead
可以告知实际读取的字节量。
返回值
- 成功 : 返回
TRUE
。 - 失败 : 返回
FALSE
。可以调用GetLastError
函数获取具体的错误代码,常见的错误包括:ERROR_ACCESS_DENIED
:权限不足,不能读取目标进程的内存。ERROR_INVALID_PARAMETER
:无效的参数,通常是内存地址错误或不合适。
参数解析:
- 进程句柄
- 要读取的地址
- 读出来存在哪里的变量地址
- 读取大小
- 默认为NULL
示例代码:
第二个参数
现在我们打开了一个植物大战僵尸的游戏,目标是读取阳光的值,我们先获取到阳光的本地地址:
也就是说,函数的第二个参数为17310500
第三个参数:
首先,他是一个LPVOID类型,long pointer长指针类型的void。
那么我们这么做:
cpp
int data=0;
&data
第四个参数:
我们可以看出游戏中的阳光是数字类型,可以用int,而int是4字节,
因此第四个参数=4
代码实例:
cpp
int main()
{
//窗口句柄
HWND hWnd = FindWindowA(NULL,"植物大战僵尸中文版");
printf("窗口句柄=%d\n", hWnd);
//窗口PID
DWORD processID = NULL;
GetWindowThreadProcessId(hWnd, &processID);
printf("窗口PID=%d\n", processID);
//进程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
printf("进程句柄=%d\n", hProcess);
//读取内存
int Buffer = 0;
//如果是浮点类型
//float Buffer=0;
ReadProcessMemory(hProcess,(LPCVOID)0x17318588,&Buffer,4,NULL);
printf("data=%d\n", Buffer);
getchar();
return 1;
}
为什么要加(LPCVOID)呢?
因此我们加上**(LPCVOID)进行强制转换。**