植物大战僵尸辅助【控制台版本】

前面介绍了使用CE和OD的简单使用:CE和OD介绍和使用CE查找阳光的教学:阳光基地址和偏移地址,下面先使用最简单的控制台程序来实现修改阳光的功能。

项目地址

1.分析程序

我们的控制台程序想要修改植物大战僵尸游戏内的数据,它们不是同一个进程,因此我们就需要先找到植物大战僵尸的进程,然后跨进程访问阳光的地址,然后跨进程写入修改后的数据。
这些步骤都需要使用WindowsAPI,因此,对于复杂的函数会单独出一期介绍。

2.查找游戏窗口的句柄

可以使用FindWindows函数来查找进程的句柄,函数定义如下:

WINUSERAPI
HWND
WINAPI
FindWindowA(_In_opt_ LPCSTR lpClassName,_In_opt_ LPCSTR lpWindowName);
WINUSERAPI
HWND
WINAPI
FindWindowW(_In_opt_ LPCWSTR lpClassName,_In_opt_ LPCWSTR lpWindowName);
#ifdef UNICODE
#define FindWindow  FindWindowW
#else
#define FindWindow  FindWindowA

首先WINUSERAPIWINAPI参考链接:Windows 编程之 WINUSERAPI 和 WINAPI 区别
然后HWND的H是handle句柄的意思,WND是Window窗口的意思
可以看到根据是否定义了UNICODE宏来使用不同的函数,由于默认定义了UNICODE宏,所以自动选用FindWindowW函数。
关于**In_opt** ,in表示这是输入参数,opt表示可以不设值。这个只是给编译器看的,不会参与编译。
LPCWSTR :LP长指针,C是const,WSTR是指w_char宽字符。
lpClassName:进程窗口的类名
lpWindowName:进程窗口的窗口名

要知道这两个参数,需要使用VS自带的Spy++工具:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Spy++同样也返回了窗口的句柄,但是窗口句柄是操作系统临时分配的,下次启动会改变。不可能每次使用这个工具采取获取,然后修改源代码。但是程序编译完成后,标题名和类名是固定的。
通过工具我们就可以这样调用函数:

HWND gameHandle = FindWindow(L"MainWindow", L"植物大战僵尸中文版");
if (gameHandle == NULL) {cout << "游戏没有打开,获取窗口句柄失败" << endl;return 0;
}

3.根据窗口句柄获取进程ID

相关的Windows API函数为:

WINUSERAPI
DWORD
WINAPI
GetWindowThreadProcessId(_In_ HWND hWnd,_Out_opt_ LPDWORD lpdwProcessId);

DWORD:定义为typedef unsigned long DWORD
_In_ :表示这个参数是输入参数
_Out_opt_ :out表示是输出参数,opt表示可选。
因为有传出参数了,就不需要返回值了。
函数官方链接
因此可以这样写:

DWORD dwPID= 0;
GetWindowThreadProcessId(gameHandle, &dwPID);
if (dwPID == 0) {cout << "获取游戏窗口PID失败" << endl;return 0;
}

4.根据进程ID获取进程句柄

相关API:

WINBASEAPI
HANDLE
WINAPI
OpenProcess(_In_ DWORD dwDesiredAccess,_In_ BOOL bInheritHandle,_In_ DWORD dwProcessId);

函数官网链接
dwDesiredAccess:官网参考链接选用值PROCESS_ALL_ACCESS ,表示进程对象的所有可能的访问权限

bInheritHandle:如果此值为 TRUE,则此进程创建的进程将继承句柄。 否则,进程不会继承此句柄。
dwProcessId:要打开的本地进程的标识符。
返回值:如果函数成功,则返回值是指定进程的打开句柄。如果函数失败,则返回值为 NULL。

因此代码如下:

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID);
if (hProcess == nullptr) {cout << "获取游戏进程句柄失败" << endl;return 0;
}

5.读取游戏进程内存

相关API:

WINBASEAPI
_Success_(return != FALSE)
BOOL
WINAPI
ReadProcessMemory(_In_ HANDLE hProcess,_In_ LPCVOID lpBaseAddress,_Out_writes_bytes_to_(nSize,*lpNumberOfBytesRead) LPVOID lpBuffer,_In_ SIZE_T nSize,_Out_opt_ SIZE_T* lpNumberOfBytesRead);

hProcess:想要读取的进程句柄。
lpBaseAddress: 要读取进程的基地址
lpBuffer:参出参数,表示从指定进程读取的值存放地址
nSize:要从指定进程读取的字节数。
lpNumberOfBytesRead:参出参数,表示实际读取字节数
返回值:如果该函数成功,则返回值为非零值。如果函数失败,则返回值为 0(零)。 要获得更多的错误信息,请调用 GetLastError。
函数官网链接

我们现在就要通过这个函数访问到阳光的基地址了,从之前的博客CE找阳光基地址得到阳光的基地址为:006A9EC0 ,一级偏移量0x768,二级偏移量为0x5560。
因此可以通过以下代码访问到动态的阳光地址:

//读取游戏进程内存
DWORD SunBaseAddress = 0x006A9EC0;     //要读取的地址
DWORD SunBaseAddressValue = 0;         //读取存放的值
DWORD Size = 0;                       //实际读取到的字节大小
if (ReadProcessMemory(hProcess, (void*)SunBaseAddress, &SunBaseAddressValue, sizeof(DWORD), (SIZE_T*)&Size) == 0) {cout << "读取基地址失败" << GetLastError() << endl;return 0;
}
DWORD SunOffsetFirst = 0x768;     //一级偏移量
DWORD SunOffsetFirstValue = 0;         //一级偏移量中存放的值
if (ReadProcessMemory(hProcess, (void*)(SunBaseAddressValue + SunOffsetFirst), &SunOffsetFirstValue, sizeof(DWORD), (SIZE_T*)&Size) == 0) {cout << "读取一级偏移地址失败" << GetLastError() << endl;return 0;
}
DWORD SunOffsetSecond = 0x5560;     //一级偏移量
DWORD SunValue = 0;         //一级偏移量中存放的值:阳光值
if (ReadProcessMemory(hProcess, (void*)(SunOffsetFirstValue + SunOffsetSecond), &SunValue, sizeof(DWORD), (SIZE_T*)&Size) == 0) {cout << "读取阳光地址失败" << GetLastError() << endl;return 0;
}
cout << "现在的阳光是:" << SunValue << endl;

运行发现抱错:
在这里插入图片描述
解决方法:可以在“ 项目 ---- 属性 ---- 配置属性 ---- C/C++ ---- 代码生成 ---- 基本运行时检查:”设置为默认值,点击应用,确定后即可。参考链接
运行结果如下,成功获取当前阳光值:
在这里插入图片描述

6.修改游戏进程内存

相关API:

WINBASEAPI
_Success_(return != FALSE)
BOOL
WINAPI
WriteProcessMemory(_In_ HANDLE hProcess,_In_ LPVOID lpBaseAddress,_In_reads_bytes_(nSize) LPCVOID lpBuffer,_In_ SIZE_T nSize,_Out_opt_ SIZE_T* lpNumberOfBytesWritten);

hProcess:要修改的进程内存的句柄。
lpBaseAddress:要写入进程的内存地址
lpBuffer:要写入的数据地址
nSize:要写入的字节大小
lpNumberOfBytesWritten:实际写入的字节数。
返回值:如果该函数成功,则返回值为非零值。如果函数失败,则返回值为 0(零)。 要获得更多的错误信息,请调用 GetLastError。
官网链接

代码如下:

cout << "想要修改的阳光值:" << endl;
cin >> SunValue;
if (WriteProcessMemory(hProcess, (void*)(SunOffsetFirstValue + SunOffsetSecond), &SunValue, sizeof(DWORD), (SIZE_T*)&Size) == 0) {cout << "写入地址失败" << endl;
}

效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch 使用Painless脚本

文章目录 1. 创建索引2. 插入模拟数据Painless 脚本的基本特点&#xff1a;Painless 脚本的常见用途1. 脚本查询和过滤示例&#xff1a;基于脚本的查询 2. 脚本字段示例&#xff1a;脚本字段 3. 聚合中的脚本示例&#xff1a;脚本聚合 4. 文档更新中的脚本示例&#xff1a;文档…

【Elasticsearch】高亮搜索:从原理到Web呈现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

15.初始接口1.0 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】&#xff08;文心一言AI生成&#xff09; 在C#编程世界中&#xff0c;接口&#xff08;Interface&#xff09;扮演着至关重要的角色&#xff0c;它定义了一组方法&#xff0c;但不提供这些方法的实现。接口作为…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中&#xff0c;我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如&#xff0c;一个简单的神经元输出可以表示为&#xff1a; z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

map和set题目练习

一、习题一&#xff1a;随机链表的复制 1.1题目详情 1.2思路 在没有学习map和set之前&#xff0c;解决这道题最大的问题就在于无法建立原链表与拷贝链表的映射关系&#xff0c;只能通过在原链表每个节点后面新建一个新的链表来进行节点间的对应&#xff0c;而学习了map之后&a…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例&#xff0c;这是第&#xff08;一&#xff09;例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

渗透测试学习笔记(五)网络

一.IP地址 1. IP地址详解 ip地址是唯一标识&#xff0c;一段网络编码局域网&#xff08;内网&#xff09;&#xff1a;交换机-网线-pcx.x.x.x 32位置2进制&#xff08;0-255&#xff09; IP地址五大类 IP类型IP范围A类0.0.0.0 到 127.255.255.255B类128.0.0.0 到191.255.25…

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl&#xff0c;环境如下&#xff0c; 由于是64位&#xff0c;因此根据书中的提示&#xff0c;从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…

jedis使用及注意事项

Jedis Jedis 是一个 Java 客户端&#xff0c;用于与 Redis 数据库进行交互。它提供了一系列简单易用的 API&#xff0c;使得在 Java 应用程序中使用 Redis 变得非常方便。以下是 Jedis 的使用方法及一些注意事项。 Jedis的优势 Lettuce客户端及Jedis客户端比较如下&#xff1a;…

浏览器执行机制

主线程 任务1&#xff0c;任务2 微队列微队列任务1&#xff0c; 微队列任务2延时队列延时队列任务1&#xff0c; 延时队列任务2交互队列.... 事件循环的工作原理 主线程执行同步任务&#xff1a; 主线程首先执行所有同步任务&#xff08;即栈中的任务&#xff09;。这些任务会…

Java 基础知识——part 4

8.成员方法&#xff1a;Java中必须通过方法才能对类和对象的属性操作&#xff1b;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息&#xff0c;方法类型和返回值类型同&#xff1b;返回值通过return返回&…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件&#xff1a;C/S系统、Winform桌面应用软件。 运行平台&#xff1a;Windows .NETCore&#xff0c;.NET8 开发工具&#xff1a;Visual Studio 2022&#xff0c;C#语言 数据库&#xff1a;Microsoft SQLServer 2012&#xff0c;Oracle 21c&#xff0c;MySQL8&#xf…

监控易 IDC 数据中心一体化智能运维平台:新质生产力的典范

一、引言 在当今数字化飞速发展的时代&#xff0c;IDC 数据中心作为信息产业的核心基础设施&#xff0c;其稳定、高效运行对于企业和社会的重要性不言而喻。随着数据量的爆炸式增长和业务复杂度的提升&#xff0c;传统的运维模式已难以满足需求&#xff0c;数据中心面临着诸多挑…

busybox学习——简单介绍

文章目录 简介官网源码目录结构构建 简介 BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils &#xff0c; shellutils等工具&#xff0c;BusyBox提供了一个比较完善的环境&#xff0c;可以适用于任…

CTFHUB 信息泄露 备份文件下载-网站源码

根据提示应是猜测网站源码的备份文件&#xff0c;可以采用bp拼接文件名和后缀 开启bp抓包后设置第一个攻击点导入文件名 第二个攻击点导入后缀 开始暴力破解&#xff0c;有成功响应的 拼接到网站后缀后可以直接下载 解压缩后记事本的名字就是flag 总结&#xff1a; …

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步&#xff1a; 告诉chatgpt&#xff1a; 将latex格式中的英文翻译为中文&#xff08;符号和公式不要动&#xff09;,给出latex格式第二步&#xff1a; Latex 转换为 Word&#xff08;使用GrindEQ &#xff09; 视频 https://www.bilibili.com/video/BV1f242…

X射线衍射全岩分析在岩石学研究中的重要性

X射线衍射全岩分析在岩石学研究中的重要性 X射线衍射&#xff08;XRD&#xff09;全岩分析在岩石学研究中扮演着至关重要的角色&#xff0c;它是一种非破坏性的分析技术&#xff0c;能够提供岩石和矿物的精细结构信息。通过解析材料内部原子排列的特征&#xff0c;XRD不仅揭示了…

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网&#xff1a;PromptCoder Bolt官网&#xff1a;https://bolt.new/ Bolt 是什么&#xff1f; Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示&#xff08;Prompt&#xff09;、运行&#x…

定时/延时任务-万字解析Spring定时任务原理

文章目录 1. 概要2. EnableScheduling 注解3. Scheduled 注解4. postProcessAfterInitialization 解析4.1 createRunnable 5. 任务 Task 和子类6. ScheduledTaskRegistrar6.1 添加任务的逻辑6.2 调度器初始化6.3 调用时机 7. taskScheduler 类型7.1 ConcurrentTaskScheduler7.2…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…