植物大战僵尸作弊器源代码(MFC版)
控制版使用不太方便,此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版)的更多相关文章
- 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码
00413184 |. E8 77E30100 |CALL PlantsVs.00431500 ; 地上的物品00413189 |. 8D7424 10 ...
- 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1972 Solved: 917[Submit][Statu ...
- Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序
题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:p ...
- BZOJ_1565_[NOI2009]_植物大战僵尸_(Tarjan+最大流+最大权闭合图)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1565 n*m的矩阵,可以种植植物,僵尸从图的右边进入吃植物.前面的植物可以保护后面的植物,还有 ...
- 部分 CM11 系统 Android 平板执行植物大战僵尸 2 黑屏的解决的方法
原文 http://forum.xda-developers.com/showthread.php?t=2755197 部分 CM11 系统的 Android 平板(比如三星 GT-P5110 )执行 ...
- tyvj P1135 - 植物大战僵尸 最大权闭合图
P1135 - 植物大战僵尸 From ytt Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 虽然这么多天了,,虽然 ...
- BZOJ 1565: [NOI2009]植物大战僵尸( 最小割 )
先拓扑排序搞出合法的, 然后就是最大权闭合图模型了.... --------------------------------------------------------------------- ...
- [置顶] cocos2d-x 植物大战僵尸(13)类似酷跑的【同一角色不同动画间的切换的实现】
有几天没和大家分享博客了,原因很简单,就是我在运行第12章所写的代码时:(开始一切正常,不过没多久就出现了内存泄露!.可能求成心切吧,当时没多加考虑就把代码发上去了.我在此对看过第12章得 ...
- 微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)
额...刚开始信誓旦旦说要写launcher制作的博客,还没写完就被抛到脑后了真是没毅力.最近把之前写的wpf的launcher改成了mfc版,遇到很多问题,写了三个星期才写完,好好记录一下吧.我也想 ...
随机推荐
- C语言位操作--不用中间变量交换两数值
1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...
- JavaScript通知浏览器,更改通知数目
http://lab.ejci.net/favico.js/ http://www.zhangxinxu.com/study/201607/web-notifications.html http:// ...
- java代码中实现android背景选择的selector-StateListDrawable的应用
首先定义一个获得StateListDrawable对象的方法: private StateListDrawable addStateDrawable(Context context, int idNo ...
- Mac - Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
在终端输入mysql,结果出现 macdeMacBook-Pro:~ mac$ alias mysql=/usr/local/mysql/bin/mysql macdeMacBook-Pro:~ ma ...
- nginx socket转发设置
1.添加依赖模块,如下 --with-stream --with-stream_ssl_module 2.nginx.conf 配置,参考说明:ngx_stream_core_module user ...
- 各浏览器Cookie大小、个数限制【转】
先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...
- MyBatis学习(一)一个简单的例子
mybatis入门例子 开发步骤: 1.创建java工程 2.加入jar包(依赖包.驱动包) 3.创建sqlMapConfig.xml 4.创建数据库,数据库表USER_C,插入测试记录 5.创建PO ...
- Mergeable Stack 直接list内置函数。(152 - The 18th Zhejiang University Programming Contest Sponsored by TuSimple)
题意:模拟栈,正常pop,push,多一个merge A B 形象地说就是就是将栈B堆到栈A上. 题解:直接用list 的pop_back,push_back,splice 模拟, 坑:用splice ...
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- YARN Architecture
The fundamental idea of YARN is to split up the functionalities of resource management and job sched ...