植物大战僵尸修改器-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.xdnf.cn/news/1559141.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

QT安装成功后-在创建项目时,发现仅有项目名文件

&#xff08;1&#xff09;QT安装成功后&#xff0c;发现仅有项目名文件其他可编辑文件缺失 &#xff08;2&#xff09;点击文件名左上角的感叹号显示【No kits are enabled for this project. Enable】 小编在尝试多次后发现&#xff0c;可以通过以下方式解决&#xff1a;QT软…

接着上一篇stp 实验继续

理论看上一篇&#xff0c;我们直接实验 首先找出&#xff52;&#xff4f;&#xff4f;&#xff54; 桥 很明显 &#xff53;&#xff57;&#xff11; 为&#xff52;&#xff4f;&#xff4f;&#xff54; 桥&#xff0c;所谓&#xff53;&#xff57;&#xff11;  &a…

从Hinton获得今年的诺贝尔物理学奖说起

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号&#xff0c;主要分享人工智能的基础知识、技术发展、学习经验等。此外&#xff0c;订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务&#xff0c;欢迎大家前来咨询&#xff0c;实现自己的…

JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录 一、集合框架体系(重要) 二、集合引入 (一)集合的理解与好处 三、Collection接口 (一)Collection接口实现类的特点 (二)Collection接口常用方法 (三)Collection接口遍历元素的方式(Iterator和增强for) 1.使用Iterator(迭代器) 1.1Iterator(迭代器)介绍 1.2Itera…

OmniH2O——通用灵巧且可全身远程操作并学习的人形机器人(其前身H2O是HumanPlus的重要参考)

前言 由于我司一直在针对各个工厂、公司、客户特定的业务场景&#xff0c;做解决方案或定制开发&#xff0c;所以针对每一个场景&#xff0c;我们都会反复考虑用什么样的机器人做定制开发 于此&#xff0c;便不可避免的追踪国内外最前沿的机器人技术进展&#xff0c;本来准备…

指针函数C++

指针函数概念 指针函数在C中是一种特殊类型的函数。从本质上讲&#xff0c;它是一个函数&#xff0c;不过其返回值是一个指针类型的数据。例如&#xff0c;像int* plusfunction(int a, int b);这样的函数声明&#xff0c;plusfunction就是一个指针函数&#xff0c;它接受两个i…

【学习笔记】Linux系统基础知识4 —— date命令详解

提示&#xff1a;学习Linux系统基础命令 date 命令详解 一、前期准备 1.已经正确安装并成功进入Linux系统 说明&#xff1a;本实验采用的 Redhat 系统&#xff08;因系统不一致&#xff0c;可能部分显示存在差异&#xff09; 二、学习内容 1、date命令 1. 功能说明 date …

SpringBoot实现电子文件签字+合同系统

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代企业中&#xff0c;合同管理和电子文件签字已成为日常运营不可或缺的一部分。为了提升效率和安全性&#xff0c;我们可以使用SpringBoot框架来实现一个电子文件签字和合同管理系统。本文将详细介绍如何…

ITMS-90899: Macs with Apple silicon support issue

文章目录 1.问题2.解决方法2.1 直接忽略这个警告邮件&#xff0c;不会影响app的正常上传2.2 通过在项目的Info.plist文件中加LSMinimumSystemVersion : 12.0 来消除警告 参考链接&#xff1a; 1.问题 ITMS-90899: Macs with Apple silicon support issue - The app isn‘t comp…

机器学习入门(一)

一、机器学习概述 1、人工智能 像人一样智能的综合与分析&#xff0c;机器模拟人类。 是一个系统&#xff0c;像人那样思考&#xff0c;像人那样理性思考。 是一个系统&#xff0c;像人那样活动&#xff0c;像人那样合理的系统 2、机器学习 让机器自动学习&#xff0c;而不…

公司防泄密软件哪个好?6款公司内部文件防泄密软件,2024超好用推荐!

企业的核心机密就如同生命之源&#xff0c;然而&#xff0c;数据泄露的风险也随之而来&#xff0c;让不少企业头疼不已。 面对这一挑战&#xff0c;选择一款高效、可靠的防泄密软件显得尤为重要。 那么&#xff0c;公司防泄密软件哪个好&#xff1f; 接下来&#xff0c;就让我…

posix接口与system V接口及其异同

POSIX接口和System V接口是用于多线程和进程间通信的两种主要编程接口。它们各自有不同的特点、功能和适用场景。以下是对这两种接口的详细介绍及其异同点。 POSIX接口 特点 标准化: POSIX&#xff08;可移植操作系统接口&#xff09;是由IEEE制定的标准&#xff0c;旨在提供统…

​ ​视觉任务大一统!图像生成,编辑,翻译三合一!全能视觉助手PixWizard来袭!

文章链接&#xff1a;https://arxiv.org/pdf/2409.15278 github链接&#xff1a;https://github.com/AFeng-x/PixWizard 亮点直击 任务统一&#xff1a;针对视觉任务的多样性&#xff0c;提出将其框架化为图像到图像的转换问题&#xff0c;并通过后处理将生成的可视化效果转化…

瑞华技术募资额巨降过半:业绩大幅下滑,信用期外应收账款占比高

《港湾商业观察》黄懿 上市的节奏有快有慢&#xff0c;常州瑞华化工工程技术股份有限公司&#xff08;下称“瑞华技术”&#xff0c;920099.BJ&#xff09;自2023年3月被北交所受理后&#xff0c;于2024年8月29日获得注册批文&#xff0c;9月25日正式挂牌上市。 据了解&#…

大学生课程设计报告--基于JavaGUI的贪吃蛇

前言 ​ 贪吃蛇游戏是一个基础且经典的视频游戏,它适合作为学习编程的人进行一些更深入的学习,可以更加了解关于循环,函数的使用,以及面向对象是如何应用到实际项目中的; ​ 不仅如此,贪吃蛇游戏的规则在思考后可以拆分,有利于学生将更多精力去设计游戏的核心逻辑,而…

前端性能优化全面指南

前端性能优化是提升用户体验的关键&#xff0c;页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法&#xff0c;从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件&#xff1a;将多…

文献下载/影响因子查询/文献检索/文献翻译平台推荐

文献下载平台 科研通 文献互助平台 - 科研通(AbleSci.com) 每天签到可领10积分&#xff0c;右上角求助文献&#xff0c;一篇10积分&#xff0c;基本实现免费下载。 尽量输入doi&#xff08;类似文献id&#xff09;&#xff0c;如果没有doi则输入标题作者摘要等信息&#xff0…

YOLO11模型推理 | 目标检测与跟踪 | 实例分割 | 关键点估计 | OBB旋转目标检测

前言 本文分享YOLO11的模型推理&#xff0c;检测任务包括物体分类、目标检测与跟踪、实例分割 、关键点估计、旋转目标检测等。 首先安装YOLO11 官方默认安装方式 通过运行 pip install ultralytics 来快速安装 Ultralytics 包 安装要求&#xff1a; Python 版本要求&…

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…