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

输出:

相关推荐
virus59451 天前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
初次见面我叫泰隆1 天前
Qt——3、常用控件
开发语言·qt·客户端
无小道1 天前
Qt——QWidget
开发语言·qt
时艰.1 天前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
子春一1 天前
Flutter for OpenHarmony:构建一个 Flutter 记忆翻牌游戏,深入解析状态管理、动画交互与经典配对逻辑
flutter·游戏·交互
梵刹古音1 天前
【C语言】 函数基础与定义
c语言·开发语言·算法
梵刹古音1 天前
【C语言】 结构化编程与选择结构
c语言·开发语言·嵌入式
Yvonne爱编码1 天前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
一方_self1 天前
了解和使用python的click命令行cli工具
开发语言·python
wdfk_prog1 天前
[Linux]学习笔记系列 -- [drivers][i2c]i2c-dev
linux·笔记·学习