[C#][原创] Minesweeper Auto Solver (Windows 7 版本)

很久很久很久很久以前,我写了个[原创][开源][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):

image

而这个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

image

或者Height

image

或者Width(十进制12=十六进制C):

image

还有Difficulty(Beginner, Intermediate, Advanced 分别对应1, 2, 3):

image

当然偏移680x44)处指向的另一个类,索性就叫做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):

image

所以大概知道怎么判断哪里是雷哪里不是雷了吧?

是不是很简单呢?

只要遍历x和y就行啦!(当然程序内的实现比较复杂一点点)

主程序

要解扫雷当然是得打开扫雷先嘛~~

然后run solver

然后就tada!

image

image

image

BUG

不过有时候还是会少点的…

image

或者是点错…

image

下载地址

需要先安装.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

« [Tutorial] Setting Up Dropbox Files Sharing [笔记] 部落格翻新小记 »
comments powered by Disqus