C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发

简言:

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)进行强制转换。**

输出:

相关推荐
海海不掉头发5 分钟前
软件开发方法第七周笔记_CSDN博客
人工智能·笔记·学习·软件工程
Zwawa10 分钟前
PID 的三个参数之外:位置式、增量式和反馈控制
c语言·单片机·嵌入式
Vae_Mars19 分钟前
幂等性学习笔记
笔记·学习·wpf
释厄62328 分钟前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857239 分钟前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
slimer42 分钟前
11.C 语言 printf 打印函数详解:格式说明符、宽度精度与安全输出
linux·c语言
Xudde.1 小时前
HackMe 靶机渗透测试(Vulnhub Writeup)
笔记·学习·安全·web安全
hflmwl81 小时前
Wise Game Booster 游戏加速软件
游戏·wisegamebooster·游戏加速软件
临床数据科学和人工智能兴趣组1 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
蜗牛互联网1 小时前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python