Delphi - XP扫雷外挂制作
技术交流,DH讲解.
本来之前就在写这个文章,还写了War3挂的教程,后来因为一些事就没有弄了.
现在过年在家又没有事就继续把这个写完吧.哈哈.
不要以为写个挂很容易,要想写个挂肯定要了解游戏呀.
我们现在来了解下地雷是怎么产生的?
其实只是我自己猜想的,毕竟这个游戏不是我写的...
1 用户选择了多大的棋盘,多少地雷后
棋盘应该是用一个二维数组来存储的,地雷数肯定是用一个全局变量来存储的.这点儿有异议没有?
没有我就继续往下说了...
2 生成地雷,肯定是随机的,那么一定会调用Rand函数咯.
a.首先判断地雷数是否为0 ---是0->结束生成过程
|
不是0
|
b.Rand产生X,Rand产生Y
|
c.判断二维数组中(X,Y)的值是否为有雷值---不是-->转到b
|
是
|
d.雷数减一---------->转到a
整个流程看懂了吧.
那么我们来实际分析呀,OD Time,从上面看我bp Rand然后进入步骤b,只要到了步骤c我们就能知道雷的内存区域了,是吧?
我们遍历区域就知道哪些格子是雷了塞.
下断点:
当断点断下来了后 我们可以看到堆栈窗口:
选中第一个,然后回车.返回:
|
1
2
3
4
5
|
01003940 /$ FF15 B0110001 call dword ptr [<&msvcrt.rand>] ; [rand01003946 |. 99 cdq01003947 |. F77C24 04 idiv dword ptr [esp+4]0100394B |. 8BC2 mov eax, edx0100394D \. C2 0400 retn 4 |
有点儿基础的朋友可以看出来,这里是它写了一个函数,先Rand一个数,然后整除另一个数,返回取余的结果.
其中这2个数是什么,上面那图我们看见2个返回到,是吧?那么选中第二个回车呗.
下断,单步走:我们就会发现压入栈的是1E=29,那么应该是30个,我们看一下是行还是列.
也就是这个这个函数传入的参数是行列数,哈哈因为这个C++的,所以PUSH那一下就是在传参数.好的看具体参数:
现在可以看出来,rand函数的参数用的返回地址,$010036D2,而rand出来值再对行列数取余,也就是[esp+4]就是这个30,这样就保证,最后这个值肯定小于30咯.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
010036C7 |> /FF35 34530001 push dword ptr [1005334] ; 将列数压入栈,发现存列的内存地址了010036CD |. |E8 6E020000 call 01003940 ; 返回X010036D2 |. |FF35 38530001 push dword ptr [1005338] ; 将行压入栈,发现存行的内存地址010036D8 |. |8BF0 mov esi, eax ; esi就是X010036DA |. |46 inc esi ; 因为rand是0~n-1,所以这里就要+1010036DB |. |E8 60020000 call 01003940 ; 返回Y010036E0 |. |40 inc eax010036E1 |. |8BC8 mov ecx, eax ; ecx就是Y010036E3 |. |C1E1 05 shl ecx, 5 ; 将Y*32,这样就转换成一维数组010036E6 |. |F68431 405300>test byte ptr [ecx+esi+1005340], 80 ; 我们这里发现数组的基址了.$80就是有雷咯010036EE |.^ 75 D7 jnz short 010036C7010036F0 |. |C1E0 05 shl eax, 5010036F3 |. |8D8430 405300>lea eax, dword ptr [eax+esi+1005340]010036FA |. |8008 80 or byte ptr [eax], 80010036FD |. |FF0D 30530001 dec dword ptr [1005330] ; 减少雷总数01003703 |.^\75 C2 jnz short 010036C7 |
我们知道上面这些,我们就来看看具体某一个雷,当我们插了小旗子后有什么变化没有:
我们执行到010036E1这句时候发现:esi是$10也就是16,ecx是3,那么16-3是雷.我们让游戏运行起来.
将这个设置成有雷后,这个内存的值就是8F了.点上红旗后:
有雷且有红旗这个值就是$8E.那么要是没有雷又被点了红旗会是什么值呢?
哈哈,$0E吧.记住了吧.我们来整理下.
1 有雷 $8F
2 无雷 $0F
3 红旗 $FE
1和3进行或,2和3进行或.
好,该Delphi了.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
procedure TForm3.Button1Click(Sender: TObject);var pid:Integer; h:Cardinal; x,y:Integer; readed:Cardinal; Count:Cardinal; I: Integer; j: Integer; buf:array of Byte;begin edt1.Text:=''; edt2.Text:=''; mmo1.Clear; //查找扫雷游戏的PID ProcessList.Snap; pid:=ProcessList.FindPID('winmine.exe'); if pid = -1 then Exit; //打开进程 h:=OpenProcess(PROCESS_ALL_ACCESS,False,pid); if h = 0 then Exit; try //取得游戏的行列数 readed:=0; ReadProcessMemory(h,Pointer($1005334),@Count,4,readed); if readed>0 then begin edt1.Text:=IntToStr(Count); x:=Count; end; readed:=0; ReadProcessMemory(h,Pointer($1005338),@Count,4,readed); if readed>0 then begin edt2.Text:=IntToStr(Count); y:=Count; end; //获取雷数组内存区域的大小 Count:=Y shl 5 + X; SetLength(buf,Count); //读取雷内存 ReadProcessMemory(h,Pointer($1005340),buf,Count,readed); //循环判断 for I := 1 to x do for j := 1 to y do if buf[32*J + I] = $8F then begin mmo1.Lines.Add(Format('雷:列:%D,行:%D',[i,j])); buf[32*J + I]:= $8E; end; //写回去,这样小红旗都标记出来了.... WriteProcessMemory(h,Pointer($1005340),buf,Count,readed); finally CloseHandle(h); end;end; |
哈哈,读取出来了吧.这里只是显示.下一篇文章,我们去寻找点击的call,然后实现自动点击.嘿嘿,秒杀.
我是DH,今天就讲这么多了.
http://www.cnblogs.com/huangjacky/archive/2010/02/20/1669643.html
Delphi - XP扫雷外挂制作的更多相关文章
- 【QT】找茬外挂制作
找茬外挂制作 找茬游戏大家肯定都很熟悉吧,两张类似的图片,找里面的不同.在下眼神不大好,经常瞪图片半天也找不到区别.于是乎决定做个辅助工具来解放一下自己的双眼. 一.使用工具 Qt:主要是用来做界面的 ...
- C#简单游戏外挂制作(以Warcraft Ⅲ为例)
网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没有过C#或者其他.NET语言编写的外挂. 作为微软. ...
- 在XP下基于VHD版XP 2003 win7制作的RAMOS心得
在XP下基于VHD版win7制作的RAMOS心得1.用DiskGenius创建1.85G的VHD固定磁盘文件,以win7prosen.vhd为例,然后进行分区格式化,格式化时启用NTFS压缩.2.为了 ...
- 扫雷游戏制作过程(C#描述):第二节、界面设计
前言 这里给出教程原文地址. 该项目已经放在github上托管. 扫雷界面设计 界面的设计,首先需要创建一个菜单栏.具体方法在左边找到工具箱窗口,展开其中的菜单和工具栏,找到MenuStrip选项,双 ...
- 扫雷游戏制作过程(C#描述):第五节、菜单操作(续)
前言 这里给出教程原文地址. 该项目已经放在github上托管. 发布版已经分享到百度网盘 菜单操作(续) 接着节前一章节的内容,我们继续完善菜单栏的功能. 我们首先,先完善Rank的选项,我们希望我 ...
- 扫雷游戏制作过程(C#描述):第一节、创建项目
前言 起初做扫雷是同学在做,我也跟着做了.做的比较low,其实第一次做这种东西,自己对自己的要求也不高,注重在了解一下,一个app应用程序是怎么产生的..net开发平台,用c#敲的.建议大家一些不懂的 ...
- 《windows程序设计》学习_3.3:利用xp扫雷资源
#include<windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPAR ...
- 扫雷游戏制作过程(C#描述):第四节、菜单操作
前言 这里给出教程原文地址. 该项目已经放在github上托管. 菜单操作 我们现在的程序单击菜单的时候不会有任何反应,这一节我们主要介绍菜单的相关代码,使得菜单能够正常使用. 现在我们希望在对应级别 ...
- 扫雷游戏制作过程(C#描述):第三节、雷区绘制
前言 这里给出教程原文地址. 该项目已经放在github上托管. 绘制雷区 这一节我们主要涉及界面中雷区的绘制.绘制雷区需要三个变量来保存雷区行数.列数.以及地雷的数量.而且我们希望能够自动获取上次游 ...
随机推荐
- iOS7支持九宫格
Beta4支持九宫格 还没试,等最终版把,现在的有很多bug还比较费电 看网上有人说虽然终于出来了但是还是不如百度搜狗等输入法方便 前几个月在weiphone上还有人问支不支持结果回帖的都说没戏 这算 ...
- stm32之中断系统
概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...
- 写一方法用来计算1+2+3+...n,其中n作为参数输入,返回值可以由方法名返回,也可以由参数返回
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 缩略图类库--ThumbLib使用简介
//加载类库文件 require_once 'path/to/ThumbLib.inc.php'; //实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址 $thumb = PhpT ...
- 转:CSS选择器笔记
作者: 阮一峰 日期: 2009年3月12日 去年我学jQuery的时候,曾经做过一点选择器(selector)的笔记. 这几天拿出来看了一下,发现很多都忘记了.所以,我决定把它们贴在这里,方便以后查 ...
- The connection to adb is down, and a severe error has occured.问题解决
遇到问题描述: 运行android程序控制台输出 [2013-06-25 11:10:32 - MyWellnessTracker] The connection to adb is down, an ...
- 具体解释EBS接口开发之WIP模块接口
整体说明 文档目的 本文档针对WIP模块业务功能和接口进行分析和研究,对採用并发请求方式和调用API方式分别进行介绍 内容 WIP模块经常使用标准表简单介绍 WIP事物处理组成 WIP相关业务流程 W ...
- 将EC2里的实例导出到RAW文件并进行修改
你可能有自己的instance在amazon云环境里面,或者是你想深度修改一下marketplace里面提供的那些系统又估计运行中的instance改动不方便 亚马逊作为云计算领域的大哥大,我不得不说 ...
- Amazon的AWS账单看起来不是很方便
发了一个PDF格式的收据,只写了收取的费用,EC2下面的明细没有. DetailAmazon Simple Notification Service $0.00Charges $0.00Estimat ...
- ioc构架demo
1.视图 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...