植物大战僵尸修改器-MFC

创建项目

创建mfc应用

基于对话框

打开资源视图下的 IDD_MFCAPPLICTION2_DIALOG

限制对话框大小 将属性中Border的值改为对话框外框

删除对话框中原有的控件

属性-外观-Caption 设置对话框标题

工具箱中拖放一个按钮

修改按钮名称

将按钮ID改为IDC_COURSE

在MFCApplication2Dlg.h中添加void CMFCApplication2Dlg::OnBtnClickedCourse();

// 实现
protected:
HICON m_hIcon;// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
void CMFCApplication2Dlg::OnBtnClickedCourse();
};

MFCApplication2Dlg.cpp: 实现文件中添加

void CMFCApplication2Dlg::OnBtnClickedCourse() {}

MFCApplication2Dlg.cpp中将按钮与函数绑定 添加ON_BN_CLICKED(IDC_COURSE, CMFCApplication2Dlg::OnBtnClickedCourse)

BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_COURSE, CMFCApplication2Dlg::OnBtnClickedCourse)
END_MESSAGE_MAP()

打印调试

TRACE函数:类似于C语言的printf,只能在DEBUG调试模式下看到打印信息(F5启动)

TRACE("age is %d\n",20);

AfxMessageBox函数

CString str;
c

MessageBox函数:只在CWnd的子类中使用,功能比AfxMessageBox多

CString str;
str.Format(CString("age is %d"),20);
MessageBox(str, CString("错误"), MB_YESNO | MB_ICONERROR);

MFC-打开网页

void CMFCApplication2Dlg::OnBtnClickedCourse() {ShellExecute(NULL,CString("open"),CString("https://blog.csdn.net/weixin_42403632"),NULL, NULL,SW_SHOWNORMAL);
}

checkbox

拖一个Check Box 文字改为秒杀僵尸 ID改为 IDC_KILL

鼠标右击-添加事件处理程序

程序自动在头文件中添加了afx_msg void OnBnClickedKill();

声明了函数 并绑定了操作

单选框的状态读取和修改

void CMFCApplication2Dlg::OnBnClickedKill()
{BOOL checked = IsDlgButtonChecked(IDC_KILL);if (checked) {//勾选了}else {//没有勾选}}

方法二 绑定变量

说明变量

绑定变量DDX_Control(pDX, IDC_KILL, m_bnKill);

自动绑定

鼠标右键添加变量

秒杀僵尸思路

通过CE搜索未知的初始值

通过僵尸的血量减少/未减少

扫描减少的数值/未变动的数值

找到僵尸血量的内存地址

找出是什么改写了这个地址

查看汇编代码

使用OD打开植物大战僵尸

搜索内存地址 00531319

往上看有一条

0053130F 2B7C24 20 sub edi,dword ptr ss:[esp+0x20]

分析出是植物打一下 血量减少的值

将汇编代码改为

sub edi,edi

不管哪种植物攻击 都一次血量-血量

实现僵尸秒杀

监控游戏

打开spy++工具

点击望远镜图标

将准星拖到植物大战僵尸窗口

添加线程

添加代码

// TODO: 在此添加额外的初始化代码// 创建一条子线程,监控游戏的打开或关闭CreateThread(NULL, NULL, monitorThreadFunc, NULL, NULL, NULL);// 保存对话框g_dlg = this;

全:


// CMFCApplication2Dlg 消息处理程序BOOL CMFCApplication2Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO: 在此添加额外的初始化代码// 创建一条子线程,监控游戏的打开或关闭CreateThread(NULL, NULL, monitorThreadFunc, NULL, NULL, NULL);// 保存对话框g_dlg = this;return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

监听方法

CMFCApplication2Dlg *g_dlg;//用来监控游戏的线程
DWORD monitorThreadFunc(LPVOID lpThreadParameter) {while (1) {// 获得植物大战僵尸窗口的句柄HWND windowHandle = FindWindow(CString("MainWindow"), CString("植物大战僵尸中文版"));if (windowHandle == NULL) {g_dlg->m_bnKill.SetCheck(FALSE);g_dlg->m_bnSun.SetCheck(FALSE);g_dlg->m_bnKill.EnableWindow(FALSE);g_dlg->m_bnSun.EnableWindow(FALSE);}else {g_dlg->m_bnKill.EnableWindow(TRUE);g_dlg->m_bnSun.EnableWindow(TRUE);}Sleep(1000);}return NULL;
}

头文件中声明

friend DWORD monitorThreadFunc(LPVOID);
//子线程句柄
HANDLE m_monitorThread;

游戏打开时修改器才能使用

功能实现

封装写内存代码

HANDLE g_processHandle;// 将某个值写入植物大战僵尸内存(后面的可变参数是地址链,要以-1结尾)
void WriteMemory(void *value, DWORD valueSize, ...) {if (value == NULL || valueSize == 0 || g_processHandle == NULL) return;DWORD tempValue = 0;va_list addresses;va_start(addresses, valueSize);DWORD offset = 0;DWORD lastAddress = 0;while ((offset = va_arg(addresses, DWORD)) != -1) {lastAddress = tempValue + offset;::ReadProcessMemory(g_processHandle, (LPCVOID)lastAddress, &tempValue, sizeof(DWORD), NULL);}va_end(addresses);::WriteProcessMemory(g_processHandle, (LPVOID)lastAddress, value, valueSize, NULL);
}void WriteMemory(void *value, DWORD valueSize, DWORD address) {WriteMemory(value, valueSize, address, -1);
}

僵尸秒杀

void CMFCApplication2Dlg::OnBnClickedKill()
{if (m_bnKill.GetCheck()) { // 需要秒杀僵尸BYTE data[] = { 0xFF, 0x90, 0x90 };WriteMemory(data, sizeof(data), 0x00531310);}else { // 不需要秒杀僵尸BYTE data[] = { 0x7c, 0x24, 0x20 };WriteMemory(data, sizeof(data), 0x00531310);}}

无限阳光

if (g_dlg->m_sunshine.GetCheck())
{ // 如果需要无限阳光DWORD value = 9990;WriteMemory(&value, sizeof(value), 0x6A9EC0, 0x320, 0x8, 0x0, 0x8, 0x144, 0x2c, 0x5560, -1);
}::Sleep(MONITOR_REFRESH_TIME_INTERVAL);

完整代码


// MFCApplication2Dlg.cpp: 实现文件
//#include "pch.h"
#include "framework.h"
#include "MFCApplication2.h"
#include "MFCApplication2Dlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endifCMFCApplication2Dlg *g_dlg;
HANDLE g_processHandle;// 将某个值写入植物大战僵尸内存(后面的可变参数是地址链,要以-1结尾)
void WriteMemory(void *value, DWORD valueSize, ...) {if (value == NULL || valueSize == 0 || g_processHandle == NULL) return;DWORD tempValue = 0;va_list addresses;va_start(addresses, valueSize);DWORD offset = 0;DWORD lastAddress = 0;while ((offset = va_arg(addresses, DWORD)) != -1) {lastAddress = tempValue + offset;::ReadProcessMemory(g_processHandle, (LPCVOID)lastAddress, &tempValue, sizeof(DWORD), NULL);}va_end(addresses);::WriteProcessMemory(g_processHandle, (LPVOID)lastAddress, value, valueSize, NULL);
}void WriteMemory(void *value, DWORD valueSize, DWORD address) {WriteMemory(value, valueSize, address, -1);
}//用来监控游戏的线程
DWORD monitorThreadFunc(LPVOID lpThreadParameter) {while (1) {// 获得植物大战僵尸窗口的句柄HWND windowHandle = FindWindow(CString("MainWindow"), CString("植物大战僵尸中文版"));if (windowHandle == NULL) {g_dlg->m_bnKill.SetCheck(FALSE);g_dlg->m_bnSun.SetCheck(FALSE);g_dlg->m_bnKill.EnableWindow(FALSE);g_dlg->m_bnSun.EnableWindow(FALSE);}else {g_dlg->m_bnKill.EnableWindow(TRUE);g_dlg->m_bnSun.EnableWindow(TRUE);// 获得植物大战僵尸的进程IDDWORD processPid;GetWindowThreadProcessId(windowHandle, &processPid);// 获得植物大战僵尸的进程句柄g_processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processPid);}if (g_dlg->m_bnSun.GetCheck()){ // 如果需要无限阳光DWORD value = 9990;WriteMemory(&value, sizeof(value), 0x6A9EC0, 0x320, 0x8, 0x0, 0x8, 0x144, 0x2c, 0x5560, -1);}Sleep(1000);}return NULL;
}// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CMFCApplication2Dlg 对话框CMFCApplication2Dlg::CMFCApplication2Dlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFCAPPLICATION2_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_KILL, m_bnKill);DDX_Control(pDX, IDC_SUN, m_bnSun);
}BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_COURSE, CMFCApplication2Dlg::OnBtnClickedCourse)ON_BN_CLICKED(IDC_KILL, &CMFCApplication2Dlg::OnBnClickedKill)ON_BN_CLICKED(IDC_SUN, &CMFCApplication2Dlg::OnBnClickedSun)
END_MESSAGE_MAP()// CMFCApplication2Dlg 消息处理程序BOOL CMFCApplication2Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO: 在此添加额外的初始化代码// 创建一条子线程,监控游戏的打开或关闭CreateThread(NULL, NULL, monitorThreadFunc, NULL, NULL, NULL);// 保存对话框g_dlg = this;return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CMFCApplication2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CMFCApplication2Dlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCApplication2Dlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMFCApplication2Dlg::OnBtnClickedCourse() {ShellExecute(NULL,CString("open"),CString("https://blog.csdn.net/weixin_42403632"),NULL, NULL,SW_SHOWNORMAL);
}void CMFCApplication2Dlg::OnBnClickedKill()
{if (m_bnKill.GetCheck()) { // 需要秒杀僵尸BYTE data[] = { 0xFF, 0x90, 0x90 };WriteMemory(data, sizeof(data), 0x00531310);}else { // 不需要秒杀僵尸BYTE data[] = { 0x7c, 0x24, 0x20 };WriteMemory(data, sizeof(data), 0x00531310);}}void CMFCApplication2Dlg::OnBnClickedSun()
{// TODO: 在此添加控件通知处理程序代码
}

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

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

相关文章

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

Golang通用代码生成器:仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式

Golang通用代码生成器&#xff1a;仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式 哑数据模式是一种使用内存数据的为快速原型准备的模式。专门为售前&#xff0c;产品经理和项目经理准备。Golang通用代码生成器支持此种模式&#xff0c;请见视频&#xff1a;https://www.bi…

【Qt+Python项目构建】- 02 Qt creator 14.0 + PySide6 如何让图像控件的尺寸变化和窗口一致

前言&#xff1a;【这是个AI不会回答的问题】 Qt Creator 新的版本又发出了&#xff0c;Pyside6 有很多新功能。但是&#xff0c;一些传统的方法要被淘汰了。 一个经典的例子是&#xff1a; 我有个一个图像要显示在Form里面的图像控件上&#xff0c;OK&#xff0c; 我现在拖…

HarmonyOs 查看官方文档使用弹窗

1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后&#xff0c;基本也就入门了&#xff0c;但是有一些操作网上没有找到合适教学的视频&#xff0c;这时&#xff0c;大家就需要养成参考官方文档的习惯了&#xff0c;因为官方的开发文档是我们学习深度任何一门语言或…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

嵌入式硬件设计中EDA布局与布线实现

大家好,今天主要给大家分享一下,如何使用立创EDA进行布局和布线,具体实现过程如下: 第一:PCB概念介绍 在介绍PCB的时候,先来说明一下,电子管的发明史。 贝尔在1876年发明了电话,爱迪生1879年发明了白炽灯、特斯拉于1888年发明了电动机,所有这些,都为电子学的诞生准…

如何修改银河麒麟高级服务器操作系统修改网卡名称(如从ens33到eth0)

如何修改银河麒麟高级服务器操作系统修改网卡名称&#xff08;如从ens33到eth0&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 查找并修改配置文件&#xff1a; 使用ifconfig查看网卡名称&#xff08;如enp1s0&#xff09;。找…

计算机网络实验一:组建对等网络

实验一 组建对等网络 实验要求&#xff1a; 1. 组建对等网络&#xff0c;会在命令行使用ipconfig&#xff0c;两网络能够相互ping通&#xff0c;尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer&#xff0c;模拟组建对等网并测试对等网 1、组建对等网络 连…

HAL+M4学习记录_4

一、按键 记录学习使用HAL库读取板载按键输入键值 板载三颗按键&#xff0c;引脚配置如下 其中K_UP按键按下为高电平&#xff0c;那么PA0引脚要配置为下拉模式&#xff1b;K0和K1按下为低电平&#xff0c;那么PE4和PE3引脚要配置为上拉模式。 二、通过按键控制LED 这里实现的…

保姆教程篇:手把手教你从零开始本地部署Dify工作流

本教程将指导您在个人电脑上安装和配置 Dify。 为什么需要Dify 在开始具体的教程之前&#xff0c;先搞清楚为什么要选择 Dify。 6 月份&#xff0c;阿里巴巴全球数学竞赛中&#xff0c;首次接受AI参赛。结果令人大跌眼镜&#xff1a;AI选手们的表现完全无法与人类选手相提并…

STM32外设详解——ADC

来源&#xff1a;铁头山羊 基本概念 ①ADC是模数转换器的统称&#xff0c;stm32f103c8t6内部集成了2个12位主次逼近型ADC&#xff0c;外设名称为ADC1、ADC2。 ② 采样深度为12位意味着ADC可以将0~3.3V的模拟电压等比转换为0~4095的数字值&#xff08;分割为2的12次方份&…

SOMEIP_ETS_178: Subscribe_using_wrong_SOMEIP_MessageID

测试目的&#xff1a; 验证DUT能够拒绝一个SOME/IP头部使用错误消息ID进行服务发现的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个使用错误消息ID的服务发现SubscribeEve…

YOLO--前置基础词-学习总结(上)

RFBNet是什么意思 RFBNet 是一种用于目标检测的深度学习网络&#xff0c;它的名字来源于 "Receptive Field Block Network"&#xff08;感受野块网络&#xff09;。简单来说&#xff0c;RFBNet 是一种可以让计算机更好地“看”图像中不同大小的物体的方法。 在图像处…

Python FFmpeg 安装使用教程

文章目录 什么是 FFmpeg&#xff1f;主要功能包括&#xff1a; Windows 下载安装下载解压安装配置环境变量 使用案例使用 ffmpeg-python 库转换视频格式视频剪辑添加字幕 使用 subprocess.run 执行视频格式转换 其它问题ffmpeg 不是内部或外部命令,也不是可运行的程序 个人简介…

虹软人脸 报错 Can‘t find dependent libraries

系列文章目录 文章目录 系列文章目录一、虹软人脸 报错 Can‘t find dependent libraries 一、虹软人脸 报错 Can‘t find dependent libraries 在项目中使用了 虹软 人脸识别SDK&#xff0c;环境一直出错。 错误&#xff1a; Can’t find dependent libraries 从错误信息来…

Arduino UNO R3自学笔记21 之 Arduino基础篇学习总结

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;目前将Arduino的大多数基础内容学习了&#xff0c;做个总结。 1.编程语言 学习单片机&#xff0c;在面向单片机编程时&#xff0c;语言是最基础的&#…

Web前端入门

文章目录 前言1 Web前端概述1.1 网站和网页1.2 HTML语言1.3 网页的形成1.4 常用浏览器1.5 浏览器内核&#xff08;渲染引擎)1.6 web标准 2 HTML标签2.1 开发工具2.2 HTML语法规则2.3 标签的关系2.4 HTML注释标签2.5 结构标签 3 常用标签3.1 标题标签3.2 段落标签3.3 换行标签3.…

HAL库常用的函数:

目录 HAL库&#xff1a; 1.GPIO常用函数&#xff1a; 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数&#xff1a; 1.HAL_U…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习启发 1. 基本知识 Conditiona…

2025考研今天开始预报名!攻略请查收

2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程&#xff1f;需要准备哪些信息&#xff1f; 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段&#xff1a; 网上预报名时间为10月9日至10月12日&#xff08;每日9&#xff1…