VC编程——XP扫雷外挂

 

以下内容转载至本人QQ空间。如有雷同,纯属巧合。

 

前段时间,应魏小子之邀请开始学习编写外挂,后来他自己找到了按键精灵解决他的问题,于是我开始了自己的研究。最近研究了windows扫雷,QQ连连看两款游戏的外挂,下面先介绍扫雷外挂。

 

为什么先研究这两款呢?主要是网上能查得到相关信息,功力不够只能由浅入深,也算是依葫芦画瓢。

先看看扫雷效果:(由于游戏时间只需要1秒,因此可以称之为“秒杀”)

 

下面是编程方法:

一:可能需要的技能:

1.了解VC或其他编程语言(本例为VC)

2.熟悉CE(Cheat Engine)的使用方法

3.熟悉OD(Ollydbg)的使用方法

4.熟悉VC的spy++的使用方法

如果不了解VC,需要下很大的功夫;如果不了解CE和OD可以在网上搜索相关教程,别指望我能教会你。

如果不了解spy++和Findwindow等函数的用法也可以网上搜索。

 

二:参考资料

1)   豆丁网——基于CE和OD开发扫雷外挂详细步骤  http://www.docin.com/p-49471470.html

2)看雪学院——CARY写的【原创】打造扫雷终极外挂 http://bbs.pediy.com/showthread.php?t=48517

 

三:方法分析

1. 首先是CARY说的猜测这个游戏要用到随机函数rand,最后真的发现游戏使用了该函数,于是用OD进行反汇编调试,找到了游戏构建雷所需数组的基地址,通过读取基地址的信息判断各个区域是否有雷。(如果游戏没有使用rand而是使用了编程者自己写的随机函数,那么该方法就不行,就只有想其他的办法,简单点说外挂制作就是要猜测编程者的编程方法,然后逆向思维,看是否有机可趁)

2. 找雷就是要找出有雷和无雷时该数值的对应值,比如该游戏中有雷就是8F,无雷时是0F。

3.CARY里面介绍的秒杀方法是可行,但是却不完美,他是通过直接修改“雷区”内存地址实现扫雷。

这有两个缺点:1)就是很容易被杀毒软件杀掉,因为你要直接写内存很多杀毒软件不允许的。

       2)由于游戏会记时还有英雄榜,直接写内存只能秒杀,不能让时间启动和停止,更不能让你登上英雄榜。除非找到写入英雄榜和停止时间的相关代码并进行信息传递,但是我一时也没找到。

4.本例采用模拟鼠标点击的方式,当读取内存发现有雷就右键单击,如果无雷就左键单击,速度很快,实现秒杀。

 

四:外挂代码

1.  主函数

DWORD addr = 0x1005361;   //windowsXP下的雷区基址,如果是其他操作系统需要自己重新找
 DWORD x = 0x10056A8;   
 DWORD y = 0x10056AC;
 RECT r1;
 POINT p;

bEnableDebugPriv();  //提升权限函数,由于OpenProcess需要管理员权限
 //保存当前鼠标指针
 //取得当前鼠标位置
 GetCursorPos(&p);

 HWND hwnd  = ::FindWindow(NULL, _T("扫雷"));   //查找应用程序窗口
 DWORD hProcessId;     

 ::GetWindowThreadProcessId(hwnd, &hProcessId);   //得到窗口进程
 ::GetWindowRect(hwnd,&r1); //得到窗口大小
 HANDLE Process = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, hProcessId);    //打开进程 
 int b = 0 , s = 0, nx = 0, ny = 0;   
 ::ReadProcessMemory(Process, (LPCVOID)x, &nx, 1, NULL);    //获取横向方格长度   
 ::ReadProcessMemory(Process, (LPCVOID)y, &ny, 1, NULL);    //获取纵向方格长度   

 for(int i = 0; i < nx * 32; i += 32)   
 {     
  for(int j = 0; j < ny; j++)     
  {       
   ::ReadProcessMemory(Process, (LPCVOID)(addr + i+j), &b, 1, NULL);       
   if (b == 0x8F || b == 0x8E)       //判断是否有雷       
   {          

  SetCursorPos(22+j*16+r1.left,115+i/32*16+r1.top);

   //移动鼠标位置,以下位置是很重要的,22和115是第一个雷相对应窗口的x,y坐标的大至距离,可以不是很精确,只要鼠标点击能实现就行,可以多根据抓图工具查看像素值,并且实践中多试一下。



    

    mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
   }    
   else
   {
    SetCursorPos(22+j*16+r1.left,115+i/32*16+r1.top);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
   }

  }  
 }   
 ::InvalidateRect(hwnd, NULL, TRUE);  
 
 SetCursorPos(p.x,p.y);
 ::CloseHandle(Process);

2. 提升权限函数 bool bEnableDebugPriv() 

HANDLE hToken;
 LUID sedebugnameValue;
 TOKEN_PRIVILEGES tkp;

 if (!OpenProcessToken(GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
   return false;
 }
 if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
  CloseHandle(hToken);
  return false;
 }
 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Luid = sedebugnameValue;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
  CloseHandle(hToken);
  return false;
 }
 return true;

 

五、外挂缺陷

1. 由于该方法是读取基址,对于不同操作系统(比如win7和XP)的该游戏的基址是不同,因此需要对不同操作系统进行量身订做,以上代码适用于XP系统,如果是win7可能findwindow类名以及雷区基址不同。

2.模拟鼠标点击方式虽然不需要写内存,但是需要读内存,如果编程者注意到这个方面,在编写程序的时候不是全局分配而是临时分配则用OD跟踪的基址就不行,对于扫雷这种小游戏而言完全可以不用全局分配,就像我同事之前搞的一个水晶连连看就不是全局分配的。

3.模拟鼠标点击方式需要扫雷窗口完全不能被其他窗口遮挡,这里可以通过代码访问扫雷设置扫雷为始终最前,还可以将外挂窗体开机最小化并且通过设置windows系统热键RegisterHotKey相关函数实现快捷键。

4.可能在打开两个以上的外挂程序时出现失灵的状况。解决方法:可以通过互斥对象及OpenMutex等函数限制多个应用外挂程序同时运行。(可以网上查询)

第2章 控件应用 75 2.1 按钮控件典型实例 76 实例049 AVI动画按钮 76 实例050 GIF动画按钮 78 实例051 图文按钮 80 实例052 不规则按钮 82 实例053 热点按钮 84 2.2 编辑框控件典型实例 86 实例054 为编辑框设置新的系统菜单 87 实例055 为编辑框控件添加列表选择框 88 实例056 多彩边框的编辑框 90 实例057 改变编辑框文本颜色 91 实例058 不同文本颜色的编辑框 92 实例059 位图背景编辑框 93 2.3 静态文本控件典型实例 94 实例060 电子计时器 94 实例061 使用静态文本控件设计群组框 96 实例062 制作超链接控件 97 2.4 列表框控件典型实例 99 实例063 利用列表框控件实现标签式数据选择 99 实例064 具有水平滚动条的列表框控件 100 实例065 列表项的提示条 101 实例066 位图背景列表框控件 104 2.5 组合框控件典型实例 105 实例067 将数据表中的字段添加到组合框控件 106 实例068 带查询功能的组合框控件 107 实例069 自动调整组合框的宽度 108 实例070 颜色组合框 109 实例071 多列显示的组合框 111 实例072 带图标的组合框 113 实例073 显示系统盘符组合框 114 2.6 列表视图控件典型实例 115 实例074 Windows资源管理器 115 实例075 利用列表视图控件浏览数据 118 实例076 利用列表视图控件制作导航界面 120 实例077 在列表视图中拖动视图项 121 实例078 具有排序功能的列表视图控件 123 实例079 具有文本录入功能的列表视图控件 126 实例080 使用列表视图设计登录界面 128 2.7 树视图控件典型实例 129 实例081 多级数据库树状结构数据显示 129 实例082 节点拖动功能的树控件 131 实例083 带复选功能的树状结构 134 实例084 三态效果树控件 135 实例085 修改树控件节点连线颜色 137 实例086 位图背景树控件 138 实例087 显示磁盘目录 140 实例088 树型提示框 141 2.8 RichEdit控件典型实例 143 实例089 利用RichEdit显示Word文档 143 实例090 利用RichEdit控件实现文字定位与标识 144 实例091 利用RichEdit控件显示图文数据 146 实例092 在RichEdit中显示不同字体和颜色的文本 148 实例093 在RichEdit中显示GIF动画 149 2.9 滚动条控件典型实例 157 实例094 自定义滚动条控件 157 2.10 进度条控件典型实例 162 实例095 进度条百分比显示 162 实例096 渐变颜色的进度条 164 2.11 工具提示控件典型实例 165 实例097 应用工具提示控件 165 2.12 滑块控件典型实例 167 实例098 使用滑块控件设置颜色值 167 实例099 绘制滑块控件 168 2.13 标签控件典型实例 170 实例100 应用标签控件 170 实例101 自定义标签控件 172 2.14 控件数组典型实例 175 实例102 向窗体中动态添加控件 175 实例103 公交线路模拟 177
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值