1、申 请 I D:好好学习的abc
2、个人邮箱:lg224@foxmail.com
3、一直在学习滴水的视频,发现有些知识点需要下载论坛源码参考。一直也想注册一个账号,希望能通过此文章获取一个账号。内容主要是用C实现植物大战僵尸无限阳光。
系统环境
- 系统:Windows 10 专业版 64位
- 软件:植物大战僵尸年度版
- 工具:Cheat Engine 7.0
- 开发工具: VS2019
- 目标:实现无限阳光
思路
- 找到阳光存放的内存地址,然后写个循环定时判断阳光是否小于某个值,小于的话就更改
查找过程
1、打开游戏进入游戏,然后打开CE,附加进程:
#### 2、搜索阳光值,获取阳光地址:
第一次先搜索50
一共11294个结果,然后回到游戏,等待阳光数值发生变化当阳光发生变化时候,在CE中输入游戏中的阳光值,然后再次扫描:
扫描完成之后发现只有一个结果。
把数值0改成10000,发现游戏中也变成了1000
我们就找到了内存地址,但是游戏重启之后他就变了,我们需要找到一个不变的地址也就是全局变量,这个全局变量通过一定的偏移可以得到阳光的地址,查看什么访问了这个地址,然后返回游戏之后,阳光变化之后CE里面也出现了指令,因为不断调试,所以下图内存地址有些变化:
因为edx这个地址也会变,所以我们要找到一个CE里面绿色的地址,绿色就是exe编译好之后不会变的地址,搜索243DF690,发现有38个。
我们需要一个个看是什么访问了这个地址,也就是谁在调用这个地址,。一般CE都会排序好前面几个就是,找了一下 发现02C8A930就是
然后我们搜索02C8A0C8,发现有几个绿色的地址;
我们手动添加地址,随便哪个+868+5578 都等于阳光的内存地址。
找到基址之后我们开始写代码,VS2019创建一个控制台项目:
VS2019 -工具-spy++获取到游戏的窗口名称:Plants vs. Zombies 1.2.0.1073 RELEASE
代码如下:
[C++] 纯文本查看 复制代码 // zwdzjs.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <stdio.h>
#include "windows.h"
int main()
{
DWORD PID=0;
HANDLE Process = 0;
DWORD SumTotal = 0;
DWORD BaseAddress = 0x0075799C;
//1.首先我们需要获取到游戏的进程pid,然后读取游戏的内存
HWND Hwnd = FindWindow(NULL, L"Plants vs. Zombies 1.2.0.1073 RELEASE");
if (Hwnd == NULL)
{
printf("植物大战僵尸僵尸没有运行,请先运行游戏\n");
return 0;
}
//2 获取进程PID
GetWindowThreadProcessId(Hwnd, &PID); //获取进程PID
if ( PID == 0 )
{
printf_s("获取PID失败\n");
return 0;
}
//打开进程
Process = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
if (NULL == Process)
{
printf_s("进程打开失败\n");
GetLastError();
return 0;
}
//获取内存地址
DWORD SunAddressValue = 0;
if (ReadProcessMemory(Process, (char*)BaseAddress, &SunAddressValue, 4, 0) == false)
{
GetLastError();
return 0;
}
//获取一级偏移地址
DWORD SunAddressFirstValue = 0;
if (ReadProcessMemory(Process, (char*)(SunAddressValue + 0x868), &SunAddressFirstValue, 4, 0) == false)
{
GetLastError();
return 0;
}
//获取二级偏移地址 也就是阳光的内存地址
if (ReadProcessMemory(Process, (char*)(SunAddressFirstValue + 0x5578), &SumTotal, 4, 0) == false)
{
GetLastError();
return 0;
}
printf("阳光的地址%d", SumTotal);
//如果阳光小于9999
while (SumTotal < 9999)
{
DWORD WriteSumTotal = 9999;
printf_s("没有阳光了,修改阳光9999");
WriteProcessMemory(Process, (char*)(SunAddressFirstValue + 0x5578),&WriteSumTotal , 4, 0);
Sleep(5000);
}
} |