简单接触c语言图形界面后就想把之前的控制台外挂小程序变成图形界面,仅供娱乐,目前只完成了两个版本即年度版和中文版的阳光和金币修改,其他修改可自行搜索偏移地址,这里奉上一篇个人认为比较详细的ce寻找基址的攻略和植物大战僵尸的全地址,大神勿喷~~
1.我爱秘籍植物大战僵尸全地址
2.ce寻找游戏基址

先简要说明下环境:

/******************
编译环境:VS2015
<最近一次修改:2017.1.12 16:17 修改者:路过的小白成长ing 修改内容:①金币基址的寻找 ②内存的修改 ③图形界面的完善 ④增加一个版本的修改>
<遗留问题:①音乐播放问题 ②输入框返回需要点击多次的问题>
******************/
第一步也是最重要的一步就是头文件以及一些所需函数的声明和变量的定义
#include "stdafx.h"
#include "stdlib.h"
#include "graphics.h"     //easyx图形库头文件
#include "conio.h"
#include "stdio.h"
#include "windows.h"
#include <mmsystem.h>    //媒体头文件#pragma comment (lib,"winmm.lib")
//WIN32的媒体播放接口
#pragma warning( disable : 4996)
//关闭vs2015生命安全周期检查,可以在新建程序的时候关闭,我忘记了⊙﹏⊙b汗~~//函数声明
void show();        //功能选择界面
void welcome();    //欢迎界面
void initFont();    //字体初始化
void Mshit();    //获取鼠标动作
void Opfun();    //进行功能选择
int FindGame();    //寻找游戏窗口
int xSun(int beat, HANDLE hGame);    //修改阳光
int xMon(int beat, HANDLE hGame);    //修改金币
int xPlantAmout(int beat, HANDLE hGame);    //修改植物槽数
int ChangeInto(LPCVOID pBase, int p1, int p2, HANDLE hGame);//修改内存
void close();   //三秒后关闭程序//定义所需的变量
MOUSEMSG msg = { 0 };
IMAGE backImg;
wchar_t str[10];
int temp = 0;   //定义用于选择不同功能
int sum = 0;    //定义用于存储value
int beat = 0;       //定义用于判断版本
LPVOID buf = (LPVOID)&sum;
DWORD byread;
LPCVOID pBase;  //定义LPCVOID类型存放基址,版本不同都不相同
int p1; //偏移1
int p2; //偏移2

接下来就是创建欢迎界面,选择自己喜欢的图片和背景音乐

void welcom()
{/*播放音乐名为"where.mp3"的音乐,这里和后面出现的L是因为当前使用的字符集是UNICODE的字符集,小伙伴们可以进入属性把它换成多字节字符集就不用加L了,如果有小伙伴音乐放不出的可以试着用:PlaySound(TEXT("where.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
后面两个参数是异步播放和循环播放,如果是SND_SYNC那就是同步播放,就不能同时进行下一步了~~~播放wav类型的音乐文件,格式转换的软件有很多*/mciSendString(L"open where.mp3 alias bgm", 0, 0, 0);mciSendString(L"play bgm repeat", 0, 0, 0);//初始化图形界面initgraph(640, 480);        //加载并显示文件名为"植物大战僵尸.jpg"的图片loadimage(&backImg, L"植物大战僵尸.jpg", 640, 480, false);putimage(0, 0, &backImg);//初始化显示的文字,为了方便我们新建一个函数initFont()initFont();
}void initFont()
{//设置输出字体settextcolor(RGB(0, 0, 3));settextstyle(50, 0, L"微软雅黑");setbkmode(TRANSPARENT);//输出文字outtextxy(240, 20, L"Begin!");outtextxy(240, 400, L"Over!");
}

完成后编译运行的效果图即封面那张图
接下来就是获取鼠标信息决定是否进行下一步了

void Mshit()
{msg = GetMouseMsg();        //获取鼠标信息if (msg.x >= 240 && msg.x <= 400 && msg.y >= 20 && msg.y <= 70){settextcolor(RED);outtextxy(240, 20, L"Begin!");}else if (msg.x >= 240 && msg.x <= 400 && msg.y >= 400 && msg.y <= 450){settextcolor(RED);outtextxy(240, 400, L"Over!");}else initFont();        //以上为文字效果设置:当鼠标移入时变换字体颜色if (msg.mkLButton)      //判断鼠标是否按下并执行相应的功能{if (msg.x >= 240 && msg.x <= 400 && msg.y >= 400 && msg.y <= 450){close();    //点击over则关闭程序}if (msg.x >= 240 && msg.x <= 400 && msg.y >= 20 && msg.y <= 70){show();    //点击begin则进入功能选择界面}}
}
//这里注意该函数需要死循环,直到用户选择为止

一步一步来,现在就是完成close()和show()函数的编写了

void close()
{int c = 3;char ch = '3';while (c){cleardevice();outtextxy(0, 0, L"3S后关闭程序···BYE~~~");outtextxy(200, 250, ch);Sleep(1000);cleardevice();c--;ch--;}closegraph();
}
void Opfun()
{while (1)       //根据鼠标按下的位置执行相应的功能{msg = GetMouseMsg();if (msg.x >= 200 && msg.x <= 400 && msg.y >= 130 && msg.y <= 170){settextcolor(RED);outtextxy(200, 130, L"1.修改阳光");}else if (msg.x >= 200 && msg.x <= 400 && msg.y >= 190 && msg.y <= 230){settextcolor(BLUE);outtextxy(200, 190, L"2.修改金币");}else if (msg.x >= 200 && msg.x <= 400 && msg.y >= 250 && msg.y <= 290){settextcolor(YELLOW);outtextxy(200, 250, L"3.修改植物槽数");}else if (msg.x >= 200 && msg.x <= 400 && msg.y >= 310 && msg.y <= 350){settextcolor(BLACK);outtextxy(200, 310, L"4.退出程序");}else show();if (msg.mkLButton){if (msg.x >= 200 && msg.x <= 400 && msg.y >= 130 && msg.y <= 170){temp = 1;FindGame();}else if (msg.x >= 200 && msg.x <= 400 && msg.y >= 190 && msg.y <= 230){temp = 2;FindGame();}else if (msg.x >= 200 && msg.x <= 400 && msg.y >= 250 && msg.y <= 290){temp = 3;FindGame();}else if (msg.x >= 200 && msg.x <= 400 && msg.y >= 310 && msg.y <= 350){outtextxy(200, 230, L"3秒后关闭程序···");close();}}}
}

···
Okay基本的界面就完成了,接下来就进入重点,也就是实现外挂功能了

//第一步先不急,先检查下游戏运行没有,运行了就看下版本是不是符合要求
int FindGame()
{cleardevice();//先清屏~~~//检查游戏版本和游戏是否运行HWND hwnd = ::FindWindow(NULL, L"Plants vs. Zombies 1.2.0.1073 RELEASE");    //这里是检查游戏窗口名,看符不符合要求,符合要求获得窗口句柄pBase = (LPCVOID)7836920;    //这个版本我找到的基址(已换十进制)beat = 1;   //我设该版本设为1if (hwnd == NULL){hwnd = ::FindWindow(NULL, L"植物大战僵尸中文版");pBase = (LPCVOID)6987456;       //这是这个版本的基址(十进制)beat = 2;   //该版本设为2}if (hwnd == NULL){int c = 3;char ch = '3';while (c){outtextxy(0, 0, L"未发现正在运行的游戏,请检查版本或运行游戏···");Sleep(1000);close();}cleardevice();return 0;    //未发现游戏,返回主菜单}//发现游戏运行检查是否寻找到的窗口是否正确RECT p;::GetWindowRect(hwnd, &p);  //获取窗口坐标settextstyle(20, 0, L"华文行楷");outtextxy(0, 0, L"程序已运行,您可以开始修改了");outtextxy(400, 0, L"窗口坐标:");_itow(p.left, str, 10);    //将整数转换为字符串outtextxy(500, 0, str);_itow(p.right, str, 10);    //同上outtextxy(560, 0, str);//输出窗口坐标验证一下DWORD Id;::GetWindowThreadProcessId(hwnd, &Id);  //获取线程、进程idHANDLE hGame;hGame = ::OpenProcess(PROCESS_ALL_ACCESS, false, Id);   //获取进程句柄switch (temp){case 1: xSun(beat, hGame); break;case 2: xMon(beat, hGame); break;case 3: xPlantAmout(beat, hGame); break;default :  return 0; break;}
}

万事俱备只欠东方了,已经找到游戏窗口和进程句柄了,就是根据选择修改相应的功能了

//如果是修改阳光就将偏移改成相应的值
int xSun(int beat, HANDLE hGame)
{if (beat == 1){p1 = 2152;p2 = 21880;}else if (beat = 2){p1 = 1896;p2 = 21856;}else return 0;ChangeInto(pBase, p1, p2, hGame);
}
//金币神马的同理
int xMon(int beat, HANDLE hGame)
{if (beat == 1){p1 = 2384; //16进制为950p2 = 80; //16进制为50}else if (beat = 2){p1 = 80;p2 = 2384;}else return 0;ChangeInto(pBase, p1, p2, hGame);
}
int xPlantAmout(int beat, HANDLE hGame)
{if (beat == 1){::ReadProcessMemory(hGame, pBase, buf, 4, &byread);pBase = (LPVOID)(sum + (int)pBase);p1 = 348;p2 = 36;}else if (beat = 2){outtextxy(0, 0, L"我是版本2");}else return 0;ChangeInto(pBase, p1, p2, hGame);
}

正式修改就显得很容易了

//传入偏移地址的值和游戏句柄
int ChangeInto(LPCVOID pBase, int p1, int p2, HANDLE hGame)
{//这里弄了个返回图标,设置点击既可以返回,可忽略IMAGE bp;loadimage(&bp, L"返回1.jpg", 55, 55, false);putimage(0, 400, &bp);//正式修改::ReadProcessMemory(hGame, pBase, buf, 4, &byread);pBase = (LPVOID)(sum + p1);::ReadProcessMemory(hGame, pBase, buf, 4, &byread);pBase = (LPVOID)(sum + p2);::ReadProcessMemory(hGame, pBase, buf, 4, &byread);_itow(sum, str, 10);outtextxy(200, 100, L"当前数值为");outtextxy(200, 120, str);if (temp = 2) outtextxy(200, 80, L"注意:金币默认乘以10,输99即990");int wsun, ret;LPVOID wbuf = (LPVOID)&wsun;int i = 1;char str2[10];do{i = 1;if (InputBox(str, 10, L"输入想要修改的数量(别太过的呦):", 0, 0, 0, 20, false) == '\0'){return 0;}else{WideCharToMultiByte(0, 0, str, 4, str2, 4, 0, 0);    //宽窄字节的转换,原因和使用L一样for (ret = 0; ret < 4; ret++){if (str2[ret] <= '9'&& str2[ret] >= '0' || str2[ret] == '\0') continue;else{outtextxy(200, 220, L"输入有误,重新输入");i = 0;cleardevice();}}wsun = atoi((const char*)str2);ret = ::WriteProcessMemory(hGame, (LPVOID)pBase, wbuf, 4, &byread);if (ret == 0){outtextxy(200, 200, L"修改失败···");}else{outtextxy(200, 200, L"修改成功");outtextxy(200, 230, L"当前数值为");outtextxy(350, 230, str);}while (i == 1){msg = GetMouseMsg();if (msg.x >= 0 && msg.x <= 100 && msg.y >= 400 && msg.y <= 500){loadimage(&bp, L"返回2.jpg", 55, 55, false);putimage(0, 400, &bp);if (msg.mkLButton){cleardevice();return 0;}}else{loadimage(&bp, L"D:\\works files/C_File/PLANTVSZOMBIES/images/返回1.jpg", 55, 55, false);putimage(0, 400, &bp);}}}} while (i == 0);       //可以对输入进行检查
}

总结起来呢修改的思路就是
①获得窗口位置 ②获得进程id进而获得进程句柄 ③根据基质和偏移获得阳光地址 ④修改
OKAY~到此就全部结束了,需要扩展功能的小伙伴请自行设置O(∩_∩)O~~
效果图:



简单的一个图形界面的应用,给自己立个flag,继续学习~~~~~~~~

作者: 路过的小白成长ing
链接:http://www.imooc.com/article/15882
来源:慕课网

C语言的图形界面?——简单外挂程序相关推荐

  1. C语言运行界面字体,C语言实现图形界面登陆窗口.docx

    纯C语言实现图形界面登陆窗口 一下是界面图: 编程工具是:VC6.0 请根据个人需要对源代码进行修改使用,图片放在工程文件夹中.新建时应该将文件后缀设置为.cpp 以下是程序灯源代码: #includ ...

  2. RHEL4- SAMBA服务(四)在x-window下图形界面简单搭建samba服务器

    RHEL4- SAMBA服务(四)在x-window下图形界面简单搭建samba服务器       在<RHEL4- SAMBA服务(一)samba服务的安装与启动>中我讲了如何安装和启动 ...

  3. 简易计算机课程设计总结,C语言课程设计报告简单计算器程序

    C语言课程设计报告简单计算器程序 (26页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 24.9 积分 .课程设计名称:C语言课程设计课程设计题目:简单 ...

  4. 能用c语言编写图形界面吗,「分享」C语言如何编写图形界面

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...

  5. c语言 显示 图形界面,「分享」C语言如何编写图形界面

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...

  6. 用c语言开发图形界面,「分享」C语言如何编写图形界面

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...

  7. 求java用人民币来转换美元,NJUPT JAVA语言 综合图形界面程序设计

    一. 实验目的和要求 学习和理解JAVA SWING中的容器,部件,布局管理器和部件事件处理方法. 通过编写和调试程序,掌握JAVA图形界面程序设计的基本方法. 实验内容: 设计和编写一个用于将人民币 ...

  8. python设计图形界面执行exe程序_Python开发案例:设计启动工具箱,显示图形界面的方式...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于云+社区,作者 用户2870857 转载地址 https://bl ...

  9. python3图形界面简单案例(tkinter)

    1.对于python3中对话框的使用: 注意python3中相对于python2有很多的变化,其中一些包的名字是改变了,比图Tkinter变为 tkinter,而对于对话框在python2中可以通过导 ...

最新文章

  1. 【软件测试培训】了解jmeter分布式测试
  2. 四因素三水平正交试验表_案例 | 螺栓装配失效试验研究
  3. .net获取地址栏中的url
  4. 在大公司天天调参数,感觉快废了~
  5. 详细描述三个适于瀑布模型的项目_信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理2...
  6. 存储极简史一幅图你就都懂了
  7. 小程序 || 语句_C ++条件语句| 查找输出程序| 套装1
  8. 正则表达式与html信息提取,基于正则表达式的HTML信息提取.pdf
  9. 诗与远方:无题(六十六)- 清明时节雨纷下
  10. Vysor_2.1.2破解,及安装包
  11. JavaWeb——新建项目与新建servlet
  12. 回顾之前易忘记的知识
  13. 20.大型网站典型故障分析
  14. 软件测试Homework03
  15. 2019智慧树python答案大全_2020智慧树知到Python程序设计参考答案
  16. 快速集成微信支付和支付宝支付
  17. 利用三轴加速器的计步测算方法
  18. 入职腾讯第九年,我辞职了!!!
  19. 巨头的工业互联网:在“黑灯工厂”探寻制造业之光
  20. 视频倍速调整(ffmpeg)

热门文章

  1. Day01-前端软件安装和课程入门
  2. 英语语法01——基础
  3. 橙色优学案例:悬浮手表海报设计简易教程
  4. Facebook一天蒸发1300亿美元 腾讯也会步Facebook的后尘吗
  5. 流氓软件综述篇:安全史上“最牛钉子户”
  6. php调用c++程序
  7. Kbone原理解析与小程序技术选型
  8. ubuntu中插入u盘可读不可写问题解决方法
  9. Vim编辑器与shell脚本(.sh)
  10. coderforce Educational Codeforces Round 44 (Rated for Div. 2) C(赛后补题)