首页
社区
课程
招聘
[下载][原创]小白也能逆向分析扫雷游戏
发表于: 2020-10-7 08:29 18777

[下载][原创]小白也能逆向分析扫雷游戏

2020-10-7 08:29
18777

      

应用程序名称:winmine.exe(扫雷)

说明:一款基础的扫雷游戏


      

系统环境:Win7 32位

工具:

       OllyDbg(动态调试代码)

       Cheat Engine(搜索数据)

       Spy++(寻找窗口回调函数)

       PEID/exeinfo(查壳,查编译环境)

       Visual Studio2019(开发程序)

       MFCInject(注入工具)



1)标注某处是否有雷

2)一键通关


首先将游戏拖拽到PEID上会发现是由C++编写的程序


 


当我们打开游戏时是一个窗口,而不是一个黑框框,猜测是SDK或MFC编写的


 


猜测是SDK编写的,这是由于

       1)点击子系统箭头,点击导入表箭头,会发现列表中有msvrt.dll,这是微软的运行时库,故多半是SDK编写


       2)列表中没有MFC特有的库

       3)查看该游戏大小只有100kb,若是MFC静态编译则会有1M左右


若游戏是由SDK编写的,这意味着会有一些相关的函数可供我们查找与调用

如   

       CreateWindowExW/CreateWindowExA(创建窗口)

       GetWindowTextA/GetWindowTextW(将指定窗口的标题拷贝到一个缓冲区内)

       SetWindowTextA/SetWindowTextW(改变控件的文本内容,窗口也是一个控件)

       rand(产生随机数函数)


1)动态调试,即从API函数入手

       由于是由SDK编写的代码,那么必定含有windows的api函数,那么就可以用OllyDbg进行调试,来探究这款游戏内部的逻辑,得到更多的信息

2)数据分析,即从变化的数据入手

       由于扫雷是一款游戏,必定有一些数据来代表着游戏的内容,诸如雷的数量,时间等信息。像雷的分布,可能会有一个数组来标注,那么我们可以通过获取数组的地址,来得到雷的分布数据。对于以上这些信息,通过Cheat Engine不仅可以获得,还可以进行修改,通过修改,可以验证我们的一些猜想。


通过观察,左上角有自定义游戏选项,可自定义高度,宽度,雷的数量,右上角的时间计时与左上角的已判断雷数计数

其中游戏通关与否与时间和待判定雷数无关,高度,宽度可用于表示坐标,雷数是用于判断的重要指标并与多项游戏机制相关,所以主要寻找高度,宽度,雷的数量这三项数据即可

 

              

 


Cheat Engine添加扫雷进程

 


通过自定义选项改变游戏的高,宽,雷数,不断搜索这些数值,筛选到最后,剩下绿色标记的就是基地址(不会因为重新打开游戏而变化的地址),最终得到6条地址信息


 

通过更改地址,得到访问数据的地址信息


  

 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-11-27 09:52 被哦哈哈哈哈编辑 ,原因:
上传的附件:
收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 344
活跃值: (922)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
BIX
2
学习学习
2020-10-8 23:22
0
雪    币: 630
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
学习学习
2020-10-10 09:12
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
想问一下这是什么语言啊?看起来是C语言?或者说是什么库呢?小白想了解一下这方面的编程知识
2020-11-6 16:06
0
雪    币: 1620
活跃值: (2405)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
5
Palmer0801 想问一下这是什么语言啊?看起来是C语言?或者说是什么库呢?小白想了解一下这方面的编程知识
黑色背景中的代码是MFC与C++,其余的(各种工具中显示的,如OD,CE)代码是汇编语言
2020-11-6 19:41
1
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
感谢楼主哈哈哈,这么细心汇编语言都解释了。主要问一下那个库呜呜呜,还没接触过这种win32编程?呜呜呜
2020-11-7 13:28
0
雪    币: 1620
活跃值: (2405)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
7
Palmer0801 感谢楼主哈哈哈,这么细心汇编语言都解释了。主要问一下那个库呜呜呜,还没接触过这种win32编程?呜呜呜

以上两张图片是我的vs2019安装的详细信息(点击visual studio installer可修改)


以上两张图片是我写的dll的导入表(用PEID可以查看)

2020-11-14 16:04
0
雪    币: 110
活跃值: (299)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好厉害。努力学习中
2020-11-17 18:00
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
哦哈哈哈哈 以上两张图片是我的vs2019安装的详细信息(点击visual studio installer可修改)以上两张图片是我写的dll的导入表(用PEID可以查看)
爱了爱了,
2020-11-20 00:35
0
雪    币: 190
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
非常详细啊,谢谢大神
2021-6-4 10:13
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
BYTE byCode = *(PBYTE)((DWORD)g_pBase + x + y * 32); 中的32是什么意思
2021-6-7 01:37
0
雪    币: 1869
活跃值: (1688)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
lambda_wall BYTE byCode = *(PBYTE)((DWORD)g_pBase + x + y * 32); 中的32是什么意思

BYTE byCode = *(PBYTE)((DWORD)g_pBase + x + y * 32); 中的32

可以看汇编代码中,C1E6 05部分 为:SHL ESI,0x5 意为左移5位,就是y*32,即2的5次方,为32

最后于 2021-11-29 09:58 被HLuKT编辑 ,原因:
2021-11-29 09:55
0
雪    币: 4711
活跃值: (4219)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
若游戏是由SDK编写的,这意味着会有一些相关的函数可供我们查找与调用

如   

       CreateWindowExW/CreateWindowExA(创建窗口)

       GetWindowTextA/GetWindowTextW(将指定窗口的标题拷贝到一个缓冲区内)

       SetWindowTextA/SetWindowTextW(改变控件的文本内容,窗口也是一个控件)

       rand(产生随机数函数)

如果不用SDK编写的话 会用什么来创建窗口呢。。。
2021-11-29 10:47
0
雪    币: 4711
活跃值: (4219)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14

哪怕是用汇编编写 创建窗口也得是用api  创建窗口的实现在Ring0 你一个ring3程序汇编在怎么写 如何可以创建一个窗口出来

最后于 2021-11-29 10:50 被木志本柯编辑 ,原因:
2021-11-29 10:49
0
雪    币: 1869
活跃值: (1688)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
15
木志本柯 若游戏是由SDK编写的,这意味着会有一些相关的函数可供我们查找与调用 如 CreateWindowExW/CreateWindowExA(创建窗口) ...
我看了下这里写的意思应该只是为了判断是使用的SDK还是MFC吧,毕竟他们的api不一样
2021-11-30 09:17
0
雪    币: 544
活跃值: (796)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
向大佬学习
2021-12-1 09:34
0
雪    币: 314
活跃值: (406)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
向大佬学习
2021-12-1 10:13
0
游客
登录 | 注册 方可回帖
返回
//