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

输出:

相关推荐
西瓜堆3 小时前
提示词工程学习笔记: 工程技术行业提示词推荐
笔记·学习
LawrenceLan3 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客3 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz3 小时前
C语言第1章
c语言·开发语言
行者964 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon4 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
666HZ6664 小时前
数据结构2.0 线性表
c语言·数据结构·算法
SmartRadio4 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词5 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派5 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习