[C#][原创] Minesweeper Auto Solver (Windows 7 版本)
29 Dec 2015很久很久很久很久以前,我写了个[原创][开源][C#] Minesweeper 外挂(Windows XP)
很久很久很久很久之后,我就写了这篇(PS:看回去之前的代码完全惨不忍睹啊)
原理解析
因为自己对逆向分析没有很了解,所以这个自动扫雷是参考别人逆向的成果和代码的:
参考文献 :
Windows 7 版本的扫雷有一些比较重要的struct(Windows 7 版本的是C++写的):
- Game
- Board
- 和其他几个struct
Game
类
在程序的base address + .data 段的virtual address + 0x88B4
处储存的是一个指针,这个指针指向扫雷的全局Game
类(或者直接是base address + 0x868B4
)
就是这样(Cheat Engine 的 base address 就直接是minesweeper.exe):
而这个Game
的结构如下(摘自关于Win7扫雷逆向分析及外挂编写):
+8 DWORD
+12 UIBoardCanvas *
+16 Board*
+24 bool
+25 bool
+26 bool
+27 bool
+28 bool
+29 bool
+30 bool
+32 int
+36 int
+40 int state
+48 DWORD
+52 DWORD
+56 Array<UITile *>*
+72 Array<UITile *>*
+88 Array<UITile *>*
+104 Array<UITile *>*
+120 Array<UITile *>*
+136 Array<UITile *>*
+152 CSQMTimeRecorder*
+188 DWORD
+192 bool
+193 bool
+194 bool
+195 bool
+196 bool
+197 bool
+200 Difficulty
+204 Width
+208 Height
+212 MineCount
+216 bool
+217 bool
+218 bool IsTimerEnabled
所以Game
类的+16
(偏移0x10
,如果你比较喜欢HEX的话)处是一个指向Board
类的指针
Board
Board
的结构如下:
+4 MineCount
+8 Height
+12 Width
+24
+28 float
+32 Difficulty
+36 HitX
+40 HitY
+44
+68 MineArrayPointer
找到了Board
大概就可以拿到很多信息了
比如说,MineCount
:
或者Height
:
或者Width
(十进制12=十六进制C):
还有Difficulty
(Beginner, Intermediate, Advanced 分别对应1, 2, 3):
当然偏移68
(0x44
)处指向的另一个类,索性就叫做ArrayA吧(代码中我是这样写的xDD)
ArrayA
ArrayA
的结构是这样的:
+0
+4
+8
+12 ArrayBPointer[]
+12
处是一个指向类型为ArrayB的指针数组,长度为Height
ArrayB
ArrayB
的结构跟ArrayA
大同小异:
+0
+4
+8
+12 ByteArrayPointer[]
+12
处是一个指向一个类型为byte的指针数组,长度为Width
而这里就是储存地雷的地方,0
是没有雷,1
是有雷
所以是要怎么看(x,y)是不是雷?
给定坐标(x,y),是不是雷就read 这个address(偏移量全部转为Hex了):
[[[[[[[minesweeper.exe + 0x868B4]+0x10]+0x44]+0x0C]+X*4]+0x0C]+Y]
(众表示这是啥?) 额..就像multi level pointer那样吧
储存地雷的变量的指针的指针的指针…..的指针…的指针…
(可以去翻翻我的CE教程来看看xDD)
如果搬到CE中呢,就是这样的(想上手CE看看这里的教程吧:[教程][原创] Cheat Engine 6.4 Tutorial —— 闯关教程 #1)
我们取(1,0)处为例子,很显然那是个雷(为什么我知道?因为Auto Solver 已经帮我截出来了 xDD):
所以大概知道怎么判断哪里是雷哪里不是雷了吧?
是不是很简单呢?
只要遍历x和y就行啦!(当然程序内的实现比较复杂一点点)
主程序
要解扫雷当然是得打开扫雷先嘛~~
然后run solver
然后就tada!
BUG
不过有时候还是会少点的…
或者是点错…
下载地址
需要先安装.net 4.0!
还在等什么呢?
赶快下载去跟小伙伴们炫耀啊~ xDD
Github 地址:https://github.com/garyng/gMinesweeperSolver7/releases/tag/v1.0
EXE 下载地址:https://github.com/garyng/gMinesweeperSolver7/releases/download/v1.0/gMinesweeperSolver7.exe
Published by Gary Ng