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

输出:

相关推荐
涛声依旧3931618 小时前
Python项目实战:学生信息管理系统
开发语言·python·数据挖掘
企鹅的蚂蚁19 小时前
【ESP32-S3开发踩坑】C++野指针引发的LoadProhibited死机与CMake依赖锁死排查
开发语言·c++
XiaoQiao66699919 小时前
python 简单题目练手【详解版】【1】
开发语言·python
Kiling_070419 小时前
Java多态、final与抽象类:面向对象编程进阶指南
java·开发语言
智算菩萨19 小时前
【Python图像处理】2 数字图像基础与Python图像表示
开发语言·图像处理·python
世人万千丶19 小时前
Flutter 框架跨平台鸿蒙开发 - 鸿蒙版本五子棋游戏应用
学习·flutter·游戏·华为·harmonyos·鸿蒙
Aktx20FNz20 小时前
一文学习 Spring AOP 源码全过程
java·学习·spring
Jay Kay20 小时前
生成式推荐模型学习记录part1
学习
Jasmine_llq20 小时前
《B3840 [GESP202306 二级] 找素数》
开发语言·c++·试除法·顺序输入输出算法·素数判定算法·枚举遍历算法·布尔标记算法
梁山好汉(Ls_man)20 小时前
鸿蒙_ArkTS解决Duplicate function implementation错误
开发语言·华为·typescript·harmonyos·鸿蒙