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

输出:

相关推荐
StickToForever1 小时前
第4章 信息系统架构(五)
经验分享·笔记·学习·职场和发展
软件黑马王子3 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
闲猫3 小时前
go orm GORM
开发语言·后端·golang
李白同学4 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
leegong231115 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
楼台的春风5 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
Moonnnn.5 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
黑子哥呢?5 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农5 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法