C语言学习day23:WriteProcessMemory函数/游戏内存数据修改工具开发

server/2024/12/20 3:04:33/

简言:

上一章我们说了获取应用进程的某数据(data),这一章我们就说说修改内存地址的数据。想要修改内存,那么就需要我们另一个WinAPI函数:WriteProcessMemory()函数。

WriteProcessMemory()函数 

函数原型:

BOOL WriteProcessMemory(HANDLE hProcess,        // 目标进程的句柄LPVOID lpBaseAddress,   // 目标内存地址的起始位置LPCVOID lpBuffer,       // 包含要写入的数据的缓冲区SIZE_T nSize,           // 要写入的字节数SIZE_T *lpNumberOfBytesWritten  // 写入的字节数
);

参数说明:

  • hProcess:
    这是目标进程的句柄,表示要写入的进程。你需要以 PROCESS_VM_WRITEPROCESS_VM_OPERATION 权限打开目标进程,以便执行写操作。可以通过 OpenProcess 函数获取进程句柄。

  • lpBaseAddress:
    这是目标进程中你想要写入的内存地址。该地址必须是该进程的有效内存区域。如果地址无效或不可写入,会导致失败。通常会是16进制,我们需要在地址前加0x,如果还报错,说明可能是没有成功将数据类型转换为LPCVOID,我们就需要强制转换,例如:(LPCVOID)0x地址

  • lpBuffer:
    指向包含要写入数据的缓冲区的指针。数据将从该缓冲区复制到目标进程的内存地址中。也就是你要写入的新数据,通常我可以在函数的上方定义一个数,然后在函数中使用。

  • nSize:
    要写入的字节数。这是你要从 lpBuffer 中复制到目标进程内存的字节数。比如int类型,它是4字节。就填4

  • lpNumberOfBytesWritten:
    可选参数。如果不为 NULL,它会接收实际写入的字节数。如果该参数为 NULL,你不需要关心写入的字节数。直接NULL

返回值

  • 如果函数成功,返回 非零 值。
  • 如果函数失败,返回 。你可以使用 GetLastError 获取更多的错误信息。

代码实例:

如上次一样打开ce和应用(植物大战僵尸),找到要改的地址(我这里修改的是阳光)。

流程:窗口句柄(FindWindowA)-->窗口PID(GetWindowThreadProcessId)-->进程句柄(Open Process)-->读取数据/改写数据(ReadProcessMemory/WriteProcessMemory)。

CE/游戏

代码:

int main()
{HWND hWnd = FindWindowA(NULL,"植物大战僵尸汉化版");DWORD processID = NULL;GetWindowThreadProcessId(hWnd,&processID);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);int Buffer = 0;ReadProcessMemory(hProcess,(LPCVOID)0x16CE01B8, &Buffer, 4, NULL);printf("原来的data=%d\n", Buffer);int NewBuffer = 8888;WriteProcessMemory(hProcess, (LPCVOID)0x16C387A8,&NewBuffer,4,NULL);printf("修改后的data=%d\n",NewBuffer);getchar();return 1;
}

运行结果:

 

 


http://www.ppmy.cn/server/151598.html

相关文章

【Docker】Docker安装MongoDB最新版并连接使用附加docker常用命令

前言 确保centos7已经安装docker,没安装docker的可以百度自行安装 一、docker安装mongodb步骤 1、docker拉取mongo镜像 docker pull mongo:latest2、查看本地镜像命令 #查看镜像命令 docker images#查看正在运行的容器 docker ps#查看全部的容器 docker ps -a3…

【NLP】第六章:位置编码Positional Encoding

六、位置编码Positional Encoding (一)为什么需要位置编码器? 前面我们花了大幅的笔墨、详细的描述了embedding层和注意力模块的计算流程,可以看出attention模块确实是学习了样本于样本之间的关系。每个样本都计算了它和所有样本…

WPF+MVVM案例实战与特效(四十一)-WPF文本到几何路径转换的艺术:轻松实现自定义字体路径生成

文章目录 1、引言2、应用场景3、案例实现1、代码实现2、字体路径应用3、运行效果4、总结1、引言 在 WPF 开发中,将文本转换为几何路径(Geometry)是一个强大但鲜为人知的功能。它不仅允许我们创建复杂的图形效果,还能让我们对文本进行更精细的控制和定制。本文将深入探讨如…

Message Processing With Spring Integration高级应用:自定义消息通道与端点

一、Spring Integration 简介 Spring Integration 是 Spring 框架的扩展,支持企业集成模式(EIP),提供轻量级的消息处理功能,帮助开发者构建可维护、可测试的企业集成解决方案。 核心目标: 提供简单的模型…

「iOS」通过CoreLocation Framework深入了解MVC架构

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构 文章目录 「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构前言CoreLocation了解根据需求建模设计属性方法设计协议传值Block传值KVONotification通知方式 总结参考文章 前言 在这个学期的前…

ChatGPT推出视频通话及屏幕理解功能,近屿智能邀您共探AI前沿技术

北京时间12月13日凌晨,OpenAI在第六天直播活动中宣布为 ChatGPT 的高级语音模式带来视频输入和屏幕理解功能,同时,为了迎接即将到来的圣诞节,OpenAI还限时推出了充满节日氛围的圣诞老人模式。 直播一开场,几位团队成员…

【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

LDR6500 TYPE-C转DP双向互传方案解析

在当前的数字时代,投屏技术已成为连接不同设备、共享内容的常用手段。LDR6500 TYPE-C转DP双向互传方案应运而生,凭借其灵活性和高清视频传输能力,满足了现代数字生活对高效能和高清晰度的需求。 一、LDR6500概述 LDR6500是由乐得瑞科技针对…