控制版使用不太方便,此MFC版与控制台版内容一样。具体可以参考前面。此处只附源代码,不加以说明。。。。。。。。。。

头文件
// jsMFCDlg.h : 头文件
// #pragma once // CjsMFCDlg 对话框
class CjsMFCDlg : public CDialogEx
{
// 构造
public:
CjsMFCDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据
enum { IDD = IDD_JSMFC_DIALOG }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现
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()
public:
//新增函数,对应按钮
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
afx_msg void OnBnClickedButton3();
afx_msg void OnBnClickedButton4();
afx_msg void OnBnClickedButton5();
afx_msg void OnBnClickedButton6();
afx_msg void OnBnClickedButton8();
afx_msg void OnBnClickedButton7();
CString mBigGuan;
CString mSmallGuan;
afx_msg void OnBnClickedButton9();
};
源文件

// jsMFCDlg.cpp : 实现文件
// #include "stdafx.h"
#include "jsMFC.h"
#include "jsMFCDlg.h"
#include "afxdialogex.h" #ifdef _DEBUG
#define new DEBUG_NEW
#endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx
{
public:
CAboutDlg(); // 对话框数据
enum { IDD = IDD_ABOUTBOX }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现
protected:
DECLARE_MESSAGE_MAP()
}; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
} void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
} BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP() // CjsMFCDlg 对话框 CjsMFCDlg::CjsMFCDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CjsMFCDlg::IDD, pParent)
, mBigGuan(_T(""))
, mSmallGuan(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
} void CjsMFCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, mBigGuan);
DDV_MaxChars(pDX, mBigGuan, );
DDX_Text(pDX, IDC_EDIT2, mSmallGuan);
DDV_MaxChars(pDX, mSmallGuan, );
} BEGIN_MESSAGE_MAP(CjsMFCDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CjsMFCDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CjsMFCDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CjsMFCDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CjsMFCDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CjsMFCDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CjsMFCDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON8, &CjsMFCDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON7, &CjsMFCDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON9, &CjsMFCDlg::OnBnClickedButton9)
END_MESSAGE_MAP() //英文原版---植物大战僵尸 //游戏基址
int base = 0x006A9EC0;
HANDLE hProcess; //根据基址,再进行两次偏移,得到最终地址。阳光、金币
int *get2Point(int base, int p1, int p2)
{
int iBase, iP1, *iP2; if (!ReadProcessMemory(hProcess, (LPVOID)base, &iBase, , NULL))
{
return NULL;
} if (!ReadProcessMemory(hProcess, (LPVOID)(iBase + p1), &iP1, , NULL))
{
return NULL;
} iP2 = (int *)(iP1 + p2);
return iP2;
} //根据基址,再进行三次偏移,得到最终地址。免CD
int *get3Point(int base, int p1, int p2, int p3)
{
int iBase, iP1, iP2, *iP3; if (!ReadProcessMemory(hProcess, (LPVOID)base, &iBase, , NULL))
{
return NULL;
} if (!ReadProcessMemory(hProcess, (LPVOID)(iBase + p1), &iP1, , NULL))
{
return NULL;
} if (!ReadProcessMemory(hProcess, (LPVOID)(iP1 + p2), &iP2, , NULL))
{
return NULL;
}
iP3 = (int *)(iP2 + p3);
return iP3;
} BOOL InitWaigua()
{
HWND hWnd = FindWindow(NULL, TEXT("植物大战僵尸中文版"));
if (NULL == hWnd)
{
AfxMessageBox(TEXT("查找窗口失败"));
return FALSE;
} DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId); //获取进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (NULL == hProcess)
{
//AfxMessageBox(TEXT("打开进程失败"));
return FALSE;
} return TRUE;
} //改阳光
void ModifySun()
{
int *sun = get2Point(base, 0x768, 0x5560);
int sunValue = ;
WriteProcessMemory(hProcess, sun, &sunValue, , NULL);
}
//改金币
void ModifyMoney()
{
int *pMoney = get2Point(base, 0x82C, 0x28);
int moneyValue = ;
WriteProcessMemory(hProcess, pMoney, &moneyValue, , NULL);
}
//免CD
void ModifyColdTime()
{
int *pCount = get3Point(base, 0x768, 0x144, 0x24);
if (pCount == NULL)
return ; int *pFirst = get3Point(base, 0x768, 0x144, 0x4C);
if (pFirst == NULL)
return ; //
int iCount = ;
ReadProcessMemory(hProcess, pCount, &iCount, , NULL);
for (int i = ; i < iCount; i++)
{
//pFirst[0] = pFirst[1];//读和写 int iRecoveryTime;
ReadProcessMemory(hProcess, pFirst + , &iRecoveryTime, , NULL);
WriteProcessMemory(hProcess, pFirst, &iRecoveryTime, , NULL); pFirst = (int *)((int)pFirst + 0x50);
}
} // CjsMFCDlg 消息处理程序
//判断是否执行操作
BOOL IsSunUnlimite = FALSE, IsMoneyUnlimite = FALSE, IsColdTimeZero = FALSE; //不断更新
DWORD WINAPI WaiguaThread(LPVOID lpParameter)
{
CjsMFCDlg *dlg = (CjsMFCDlg *)lpParameter;
while ()
{
Sleep();
//检测游戏是否启动
if (InitWaigua())
{
//检测到了游戏
dlg->SetDlgItemText((int)IDC_STATIC10, TEXT("已经检测到游戏启动")); //保存原来的三个字节
//ReadProcessMemory(hProcess, pCode, oldOpCode, 3, NULL);
}
else
{
//设置窗口状态,没有检测到游戏
dlg->SetDlgItemText((int)IDC_STATIC10, TEXT("未检测到游戏启动"));
continue;
} if (IsSunUnlimite)
{
ModifySun();
}
if (IsMoneyUnlimite)
{
ModifyMoney();
}
if (IsColdTimeZero)
{
ModifyColdTime();
}
}
return ;
}
//免暂停的基址
unsigned char *pCode = (unsigned char *)0x4502C0;
unsigned char oldOpCode[];
//更换的地址
unsigned char newOpCode[] = "\xC3\x04\x00"; BOOL CjsMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
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); // 设置小图标 ShowWindow(SW_MINIMIZE); // TODO: 在此添加额外的初始化代码
//创建线程来不停修改阳光。。。。。 CreateThread(, , WaiguaThread, this, , ); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
} void CjsMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
} // 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。 void CjsMFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), ); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + ) / ;
int y = (rect.Height() - cyIcon + ) / ; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
} //当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CjsMFCDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
} void CjsMFCDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
IsSunUnlimite = TRUE;
} void CjsMFCDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
IsSunUnlimite = FALSE;
} void CjsMFCDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
IsMoneyUnlimite = TRUE;
} void CjsMFCDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
IsMoneyUnlimite = FALSE;
} void CjsMFCDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
IsColdTimeZero = TRUE;
} void CjsMFCDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
IsColdTimeZero = FALSE;
} //禁用暂停 void NoPause()
{
DWORD dwOldProtect;
VirtualProtectEx(hProcess, pCode, , PAGE_EXECUTE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProcess, pCode, newOpCode, , NULL);
VirtualProtectEx(hProcess, pCode, , dwOldProtect, NULL);
} void YesPause()
{
DWORD dwOldProtect;
VirtualProtectEx(hProcess, pCode, , PAGE_EXECUTE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProcess, pCode, oldOpCode, , NULL);
VirtualProtectEx(hProcess, pCode, , dwOldProtect, NULL);
} void CjsMFCDlg::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
NoPause();
} void CjsMFCDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
YesPause();
} void ModifyGuanka(int iGuanka)
{
int *pGuanka = get2Point(base, 0x82C, 0x24);
WriteProcessMemory(hProcess, pGuanka, &iGuanka, , NULL);
} void CjsMFCDlg::OnBnClickedButton9()
{
// TODO: 在此添加控件通知处理程序代码 UpdateData(); TCHAR *pStopstring;
long lBigGuan = wcstol(mBigGuan, &pStopstring, );
long lSmallGuan = wcstol(mSmallGuan, &pStopstring, );
if (lBigGuan < || lBigGuan > )
{
AfxMessageBox(TEXT("大关关卡不合格"));
return;
}
if (lSmallGuan < || lSmallGuan > )
{
AfxMessageBox(TEXT("小关关卡不合格"));
return;
} int iGuanka = (lBigGuan - ) * + lSmallGuan;
ModifyGuanka(iGuanka); //AfxMessageBox(mBigGuan + mSmallGuan);
}

植物大战僵尸作弊器源代码(MFC版)的更多相关文章

  1. 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码

    00413184 |. E8 77E30100   |CALL PlantsVs.00431500                  ; 地上的物品00413189 |. 8D7424 10     ...

  2. 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1972  Solved: 917[Submit][Statu ...

  3. Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  4. BZOJ_1565_[NOI2009]_植物大战僵尸_(Tarjan+最大流+最大权闭合图)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1565 n*m的矩阵,可以种植植物,僵尸从图的右边进入吃植物.前面的植物可以保护后面的植物,还有 ...

  5. 部分 CM11 系统 Android 平板执行植物大战僵尸 2 黑屏的解决的方法

    原文 http://forum.xda-developers.com/showthread.php?t=2755197 部分 CM11 系统的 Android 平板(比如三星 GT-P5110 )执行 ...

  6. tyvj P1135 - 植物大战僵尸 最大权闭合图

    P1135 - 植物大战僵尸 From ytt    Normal (OI)总时限:10s    内存限制:128MB    代码长度限制:64KB 背景 Background 虽然这么多天了,,虽然 ...

  7. BZOJ 1565: [NOI2009]植物大战僵尸( 最小割 )

    先拓扑排序搞出合法的, 然后就是最大权闭合图模型了.... --------------------------------------------------------------------- ...

  8. [置顶] cocos2d-x 植物大战僵尸(13)类似酷跑的【同一角色不同动画间的切换的实现】

          有几天没和大家分享博客了,原因很简单,就是我在运行第12章所写的代码时:(开始一切正常,不过没多久就出现了内存泄露!.可能求成心切吧,当时没多加考虑就把代码发上去了.我在此对看过第12章得 ...

  9. 微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)

    额...刚开始信誓旦旦说要写launcher制作的博客,还没写完就被抛到脑后了真是没毅力.最近把之前写的wpf的launcher改成了mfc版,遇到很多问题,写了三个星期才写完,好好记录一下吧.我也想 ...

随机推荐

  1. C语言递归练习

    1.炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推.写一个递归函数CannonBall,这个函数把 ...

  2. Egret第三方库的制作和使用(模块化 第三方库)

    一.第三方库的制作 官方教程:第三方库的使用方法 水友帖子:新版本第三方库制作细节5.1.x 首先在任意需要创建第三方库的地方,右键,选择"在此处打开命令窗口" 输入egret c ...

  3. [算法]Bobmer

    package com.company; import com.sun.org.apache.bcel.internal.generic.AASTORE; import java.awt.*; imp ...

  4. [工具] multidesk

    MultiDesk 是一个选项卡(TAB标签)方式的远程桌面连接 (Terminal Services Client). http://www.hoowi.com/multidesk/index_ch ...

  5. React 属性和状态的一些总结

    一.属性 1.第一种使用方法:键值对 <ClaaNameA name = “Tom” /> <ClaaNameA name = {Tom} /> <ClaaNameA n ...

  6. yii---模型的创建

    在 model/ 路径新建 Test.php 模型 我们类的名称一定要与数据表的名称相同. 继承 yii\db\ActiveRecord 类: 在模型类中 声明 tableName() 指定表名 // ...

  7. Oracle数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) Select table_Name As Name,Comments As Value From User_Tab_Comments Where table_Type='T ...

  8. ELK之Logstash使用useragent获取浏览器版本、型号以及系统版本

    参考文档:http://www.51niux.com/?id=216    https://www.cnblogs.com/Orgliny/p/5755384.html Logstash中的 logs ...

  9. uploadify3.2.1 多文件上传总是只能上传一个文件

    再网上找了老半天原因,有人说是上传时调用方法参数应该加上*号(:$('#mulfile_upload').uploadify('upload','*');) 总是不行, 我怀疑下面的原因: 我就以为是 ...

  10. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...