2023-08-10 11:00:01作者:02502攻略网
今天小编花点时间给大家讲讲植物大战僵尸外挂教程,希望大家给点意见。
关于CECheat Engine的用法,以后有时间的话 会发表相关视频教程。
根据查到指针永久基址+偏移地址 就可以获得/设置 阳光值。所以我们可以通过打开游戏进程,改写进程内相应的内存就可以实现游戏的修改。
现在直接上源代码:
#include
#include
#include
int mainvoid
char input;
HWND hWnd; //窗口句柄
DWORD pid; //进程句柄
HANDLE hProcess = 0;
//阳光的基地址和偏移
DWORD ba_addr = 0xF8;//基地址
DWORD m_offset1 = 0x868;//偏移1
DWORD m_offset2 = 0x5578;//偏移2
printf" O.打开游戏进程 M.修改阳光 ";
printf" Q.退出外挂 ";
printf" ";
while 1
input = getchar;
if input == 'O' || input == 'o'
hWnd = FindWindowNULL, _T"Plants vs. Zombies 1.2.0.1073 RELEASE" ;
if hWnd != 0
GetWindowThreadProcessIdhWnd, pid;
hProcess = OpenProcessPROCESS_ALL_ACCESS, FALSE, pid;//打开进程,取得句柄
if hProcess == 0
printf"打开游戏进程失败 ";
printf"打开游戏进程成功!! ";
printf"游戏没有运行,或者没有使用管理员身份运行本外挂. ";
if input == 'M' || input == 'm'
if hProcess == 0
printf"请先打开游戏进程";
DWORD m_tempadd;
DWORD YG;
//读取基址里面的数据是一个指针
ReadProcessMemoryhProcess, LPVOIDba_addr, m_tempadd, 4, 0;
//基址加偏移地址1的数据是一个指针
ReadProcessMemoryhProcess, LPVOIDm_tempadd + m_offset1, m_tempadd, 4, 0;
/**********************
*这里相当于一个二级指针加偏移地址
*ReadProcessMemory函数 读取相应进程的指定位置 指定大小的数据到缓冲区
*基址加偏移地址 为二级指针
*基址加偏移地址取内容 再加 偏移地址为一级指针 这个指针就是指向了阳光值的内存单元
******************/
//要修改的内存地址是tempadd+offset4
DWORD res = WriteProcessMemoryhProcess, LPVOIDm_tempadd+m_offset2, YG, 4, 0;
if res == 0
printf"修改失败";
printf"修改成功";
if input == 'Q' || input == 'q'
return 0;
GUI版本修改器
#pragma once
#include
#include
#include
extern HWND hWnd; //窗口句柄
extern DWORD pid; //进程句柄
extern HANDLE hProcess;
//阳光的基地址和偏移
extern DWORD ba_addr;//基地址
extern DWORD m_offset1;//偏移1
extern DWORD m_offset2;//偏移2
extern int openGameJc;//打开游戏进程
extern int UpdateYGint value;//修改阳光
#include"WG.h"
HWND hWnd; //窗口句柄
DWORD pid; //进程句柄
HANDLE hProcess = 0;
//阳光的基地址和偏移
DWORD ba_addr = 0xF8;//基地址
DWORD m_offset1 = 0x868;//偏移1
DWORD m_offset2 = 0x5578;//偏移2
int UpdateYGint value
if hProcess == 0
return 0;
DWORD m_tempadd;
DWORD YG;
YG = unsigned longvalue;
//读取基址里面的数据是一个指针
ReadProcessMemoryhProcess, LPVOIDba_addr, m_tempadd, 4, 0;
//基址加偏移地址1的数据是一个指针
ReadProcessMemoryhProcess, LPVOIDm_tempadd + m_offset1, m_tempadd, 4, 0;
/**********************
*这里相当于一个二级指针加偏移地址
*ReadProcessMemory函数 读取相应进程的指定位置 指定大小的数据到缓冲区
*基址加偏移地址 为二级指针
*基址加偏移地址取内容 再加 偏移地址为一级指针 这个指针就是指向了阳光值的内存单元
******************/
//要修改的内存地址是tempadd+offset4
DWORD res = WriteProcessMemoryhProcess, LPVOIDm_tempadd + m_offset2, YG, 4, 0;
if res == 0
return 0;
return 1;
int openGameJc
hWnd = FindWindowNULL, _T"Plants vs. Zombies 1.2.0.1073 RELEASE";
if hWnd != 0
GetWindowThreadProcessIdhWnd, pid;
hProcess = OpenProcessPROCESS_ALL_ACCESS, FALSE, pid;//打开进程,取得句柄
if hProcess == 0
return 0;
return 1;
return 0;
#include
#include"WG.h"
#include
HINSTANCE appInstance;
LRESULT CALLBACK WndProcHWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam;
int WINAPI WinMainHINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow
appInstance = hInstance;
static TCHAR szAppName = TEXT"MyWindows";
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
= CS_HREDRAW | CS_VREDRAW;
= WndProc;
= 0; //额外空间
= 0; //额外空间
= hInstance; //实例句柄
= LoadIconNULL, IDI_APPLICATION;//图标
= LoadCursorNULL, IDC_ARROW;//光标
= HBRUSHGetStockObjectWHITE_BRUSH;//白色
= NULL;//菜单
= szAppName;//窗口类名
//注册窗口类
if !RegisterClasswndclass
MessageBoxNULL, TEXT"这个程序需要在 Windows NT 才能执行", szAppName, MB_OK;
return 0;
//创建窗口 设置窗口属性
hwnd = CreateWindowszAppName, //窗口类名称
TEXT"植物大战僵尸外挂v1.0", //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格
200, //CW 创建窗口选项 初始 x坐标
200, //初始y坐标
300, //初始 x方向尺寸
300, //初始y方向尺寸
NULL, //父窗口句柄
NULL, //窗口菜单句柄
hInstance, //程序实例句柄
NULL //创建参数
//CreateWindow后 会产生几个 非队列消息 直接调用过程函数重点
ShowWindowhwnd, iCmdShow;
UpdateWindowhwnd;//重点 UpdateWindow会 直接发送一个非队列的 WM_PAINT消息 让窗口绘制
//因为 WM_PAINT默认是在 队列最后的 但是这里在最后的话 就不好,一个窗口创建 后 ShowWindow后就应该立即显示上面的文字
//所以调用UpdateWIndow 让它立即绘制
/******************
*消息循环,操作系统 会把所有 消息 分配给 每个应用程序
* 所以每个应用程序都有一个消息队列,GetMessage就是向当前程序的 消息队列内获取消息
*lpMsg第一个参数 用于存放当前获取的消息
*hWnd需要获取消息的 窗口句柄,为NULL时 获取当前程序所有窗口的消息必须属于当前线程
*wMsgFilterMin 指定获取消息值的最小整数消息其实就是整数
*wMsgFilterMax 指定获取小的最大值
*********************/
while GetMessagemsg, NULL, 0, 0
TranslateMessagemsg;//函数将虚拟键消息 转换为字符消息,
DispatchMessagemsg;//函数分派一个消息给窗口过程函数,实际上是给操作系统操作系统调用的
return ;
/***************
*1、在WinMain主函数中,最后的返回值是,这个参数是传递给void PostQuitMessageint nExitCode; 这个函数的参数nExitCode的。
* 2、nExitCode:指定应用程序退出代码。此值被用作消息WM_QUIT的wParam参数。
*3、总之,当接收到一个WM_QUIT消息时,程序就中止。这时,WinMain函数应退出应用程序,并且返回传递给WM_QUIT消息的wParam参数的值。如果由于调用PostQuitMessage函数而接收到WM_QUIT消息,此时WM_QUIT消息的wParam的值即是PostQuiMessage函数的nExitCode的值。nExitCode一般为0。
***************/
LRESULT CALLBACK WndProcHWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
HWND hButton;
HWND hEdit;
HDC hdc; //Handle Device Context
HWND hbtnUpdate;//修改阳光
PAINTSTRUCT ps;
RECT rect;
LPTSTR result128; //结果
switch uMsg
case WM_PAINT:
hdc = BeginPainthWnd, ps;
GetClientRecthWnd, rect;
DrawTexthdc, TEXT"叫我涵涵", 1, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER;
EndPainthWnd, ps;
case WM_CREATE:
hEdit = HWNDCreateWindowTEXT"edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT ,
120, 0,150, 20, hWnd, HMENU111, appInstance, NULL;
hButton = HWNDCreateWindowTEXT"Button", //Button是预定义 窗体类
TEXT"打开游戏进程",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
10, 10, 100, 50,
HMENU110, //重点这里设置按钮id,但是 原本是设置菜单的 所以需要HMENU
appInstance,
//修改阳光
hbtnUpdate = HWNDCreateWindowTEXT"Button", //Button是预定义 窗体类
TEXT"修改阳光",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
120, 40, 150, 40,
HMENU112, //重点这里设置按钮id,但是 原本是设置菜单的 所以需要HMENU
appInstance,
/*******************
* 当用户点击菜单、按钮、下拉列表框等控件时候,
*会触发 是控件或菜单或加速键的ID
*如果LOWORDwParam 是控件ID,HIWORDwParam是notification code,
*比如BN_CLICKED, BN_DBLCLK等,标志用户对控件的操作,双击,单击
*lparam 是子窗体句柄
*********************/
case WM_COMMAND:
//按钮
if LOWORDwParam == 112 HIWORDwParam == BN_CLICKED
//根据父窗口句柄 以及 控件id, 获取 空间句柄,然后用GetWindowText获取 控件内的文本
GetWindowTextGetDlgItemhWnd, 111, result, 128;
if UpdateYG_ttoiresult == 1
MessageBoxhWnd, TEXT"修改成功", TEXT"涵涵提示", MB_OK;
MessageBoxhWnd, TEXT"修改失败", TEXT"涵涵提示", MB_OK;
if LOWORDwParam == 110 HIWORDwParam == BN_CLICKED
ifopenGameJc==1
MessageBoxhWnd, TEXT"开启游戏进程成功", TEXT"提示", MB_OK;
MessageBoxhWnd, TEXT"开启游戏进失败", TEXT"提示", MB_OK;
case WM_DESTROY:
PostQuitMessage0;
/********成功退出 ****
****************
*用户通过点击关闭程序按钮后,消息队列增加一条消息WM_CLOSE,
*然后程序从消息队列中取走WM_CLOSE,调用DestroyWindow,
*消息队列增加WM_DESTROY,应用程序再次取走,并调用PostQuitMessage,
*最终得到WM_QUIT而使消息循环退出,程序退出。
************/
default:
//我们不想关心的都用 默认处理方式
return DefWindowProchWnd, uMsg, wParam, lParam;
return 0;
获取方式:
1.在你手机的右上角有关注选项,或点击我的头像,点击关注!关注我
2.关注后,手机客户端点击我的主页面,右上角有私信,请私信发我:编程
电脑已经设置好了关键词自动回复,自动领取就好了!这几天上万个消息,真的回复不过来,所以回复的时候请注意关键词!
其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里请私信我“编程”不管你是小白还是大牛欢迎入住大家一起交流成长。小编会在里面不定期分享干货源码,包括我精心整理的一份c++零基础教程。欢迎各位感兴趣的的小伙伴。
学习思路:
学习资料: