控制版使用不太方便,此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. time_t到.NET DateTime的转换

    time函数返回的time_t是一个utc时间且相对于1970年1月1日的total seconds,转换到DateTime只需以相同的方式转换回去即可. C/C++ auto t = time(); ...

  2. 【CF896E】Welcome home, Chtholly 暴力+分块+链表

    [CF896E]Welcome home, Chtholly 题意:一个长度为n的序列ai,让你支持两种操作: 1.l r x:将[l,r]中ai>x的ai都减去x.2.l r x:询问[l,r ...

  3. jfinal的model和record如何相互转化?

    一.model转record: Model类: 1. /** * Convert model to record. */public Record toRecord() { return new Re ...

  4. C++ 标准输出cout与printf

    C++标准输出cout与printf都可以,printf用法更死板一些. #include <iostream> int main(int argc, char** argv) { usi ...

  5. RabbitMQ安装详解(centos6.8)(转自:http://www.cnblogs.com/zhen-rh/p/6862350.html)

    1.下载rabbitmq安装包 2.安装erlang a.安装Erlang Solutions仓库到你的系统(目的在于让你可以使用yum安装到最新版本的erlang, 如果不设置, yum安装的erl ...

  6. easyui---基础组件:window

    window 依赖下面三个组件,就是继承,所以下面的特性和方法 事件都可以用 draggable resizable panel window 和panel不同之处,可以有拖拽移动draggable, ...

  7. 初识Spring Webflux

    Important to know is that there are two ways to use Spring Webflux. One using annotations, which is ...

  8. 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; 读取 fastcgi_send_timeout 600; 发请求

    使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75;  链接 fastcgi_read_timeout 600; ...

  9. nginx之配置proxy_set_header

    win10客户端请求web服务,win10的ip:192.168.223.1 nginx作为反向代理服务器:192.168.223.136 nginx作为后端web服务器:192.168.223.13 ...

  10. 360电影主页和详情页爬去入Mysql库链表读取--lowbiprogrammer

    import requests,os,jsonfrom lxml import etreefrom pymysql import *class Movie(object):def __init__(s ...