首页
社区
课程
招聘
[原创]揭秘游戏外挂开发技术(一)
发表于: 2018-2-8 15:59 38464

[原创]揭秘游戏外挂开发技术(一)

2018-2-8 15:59
38464

5ecurity团队(5ecurity.cn)成员 晓虎(xiaohu@5ecurity.cn)原创发布


学习逆向分析和外挂编程也有一段时间了,我总结了外挂开发的基本思路和一些初级的方法和技巧。首先说说基本思路吧。我觉得外挂开发主要分为两部分:

一是对游戏的分析调试,主要是找基址和call地址等游戏信息。

二是使用编程工具进行外挂功能开发,比如用delphi或者VB、VC等自己熟悉的一种开发工具进行开发。

开发中使用的技巧一般包括:

窗口查找

获得窗口句柄

获得进程句柄

读取游戏进程内存

修改游戏进程内存

远程call调用等

通过学习和交流我发现用简单的小游戏入门还是很容易的,下面我就以QQ挖金子游戏为例与大家分享我的入门经历吧。

工欲善其事必先利其器,首先说说我们要使用的工具吧,对于刚入门的一来说首先掌握几款常用的工具即可,对于简单的游戏分析,调试工具使用CE即可,编程工具我们使用DELPHI7(当然也可以使用delphi2010,不过推荐使用delphi7,因为delphi7的绿色U盘版很好用、很方便哈),需要一个辅助工具SPY++,不过delphi7的绿色版已经集成了很多辅助工具,这也是我极力推荐的原因。


第一部分:游戏调试篇


在开始编程之前,首先是对游戏进行分析,获得游戏窗口基本信息和数据内存基址,这一步需要有一定的逆向工程能力和耐心。


第一步:游戏窗口信息的获取


首先是获得窗口标题信息,我们可以用SPY++这类工具进行分析,不过在分析的过程中发现SPY++是无法查到挖金子游戏窗口标题的(看来腾讯是把微软的这个窗口分析工具给屏蔽了),因此我们使用delphi7绿色版自带的工具Spy4Win来进行查找,方法比较简单:

在delphi7的“Tools”菜单下找到工具“Spy4Win”,如图一所示


然后拖动Spy4Win界面上的小狗图标到QQ挖金子游戏窗口,就可以查看窗口信息了。查找到的信息如图2所示:

在工具的“代码”页可以看到关于窗口句柄查找的api函数,而且还有vc、vb、delphi三个版本的说明,这对编程是有一定帮助的。如图3所示:

记录这些信息,我们继续下一步的分析。其实只要记住图3中的代码即可。


第二步:游戏内存地址的获取


分析游戏数据在内存中的地址是比较重要的,因为外挂的原理一般都是通过对游戏数据的操作来实现外挂功能的。首先我们确定要查找的数据:座位号、时间、踩雷数据等。

打开CE,附加游戏进程,如图4所示:

然后变换座位号,用CE查找变化的数据。操作方法如下:首先设置扫描类型为“未知初始化数值”、数值类型为“字节”,然后点击“首次扫描”进行数据获取。如图5所示:

这样会找到很多结果,然后在QQ游戏大厅中,换座位,再在CE窗口中设置扫描类型为“更改的数值”,点击“再次扫描”进行数据的筛选。如图6所示:

如上步骤反复筛选,在结果栏中绿色数据就是我们要找的座位号基址了。然后双击这个基址将其保存在下面的数据监视窗口进行实时查看。如图7所示:

那么座位号基址就是:0043E1F4。下面我们来查找其他数据了,查找其他数据的方法与此类似,游戏开局以后,时间的值会逐渐减少,那我们就可以用CE查找“减少的数值”进行筛选。如图8所示:

时间的基址就是:0043E0A9。下面再查查踩雷的数据地址了,一开始找这个地址的时候有点麻烦,方法是这样的:在没有踩雷时在CE中扫描“未知初始化数值”,踩雷后在CE中扫描“更改的数值”,然后在挖金子中点击“取消”后,回到CE中扫描“更改的数值”,多次踩雷后扫描后发现三个基址。也发现一个规律:踩雷后这三个地址的数据变为1,未踩雷或者点击“取消”后者三个数据都为0,因此大家在找这三个基址的时候可以使用这个规律进行快速查找,如图9所示:

踩雷的基址就是:0043C698、0043C788、0043E06C。也许你已经想到了,只要让这3个地址的数据始终为0就可以实现踩雷不死了。呵呵,得到了这些游戏数据在内存中的地址后,我们就可以通过编程来实现外挂功能了。


第二部分:外挂编程篇


编程我们主要使用delphi来实现,如果你擅长其他编程语言也可以使用其他编程工具来实现。基本原理都是一样的,调用的API函数基本也是一样的。界面可以如图10设计:

下面就是编写功能代码了,主要介绍核心代码,完整工程及外挂程序关注5ecurity公众号领取。


第一步:进程句柄获取


获得了游戏的基本信息就可以通过编程来实现几个简单的功能了。关于api函数的说明MSDN中说的很详细了,这里就不多说了,核心代码如下:

begin
  //获取挖金子游戏窗口句柄
  Gameh:=findwindow('#32770','挖金子');
  //通过窗口句柄获取进程ID
  GetWindowThreadprocessID(Gameh,GamePid);
  //获取进程句柄
 gamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);
end;

第二步:修改内存数据


首先是时间无限功能的实现,这个功能可以通过定时修改时间基址的数据来实现,我这里用的是时间控件实现的,时间间隔为每秒。

  timestop:=30000;
  Writeprocessmemory(gamehProcess,pointer($0043e0a8),@timestop,4 ,WriteByte);

踩雷不死功能也比较简单,通过前面分析,只要保持下面三个地址的数据一直是0就可以了,代码如下:

  undie:=0;
  Writeprocessmemory(gamehProcess,pointer($0043C698),@undie,4 ,WriteByte);
  Writeprocessmemory(gamehProcess,pointer($0043C788),@undie,4 ,WriteByte);
  Writeprocessmemory(gamehProcess,pointer($0043E06C),@undie,4 ,WriteByte);

秒杀功能可以通过修改座位号的方法实现,在调试时发现座位号是这样分布的0、1、2、3代表上、右、下、左四个座位,如果将座位号复制为其他不存在的数据,则可实现秒杀的效果,这应该是游戏的一个bug吧。具体功能实现代码很简单,如下编写即可:

  seckill:=4;
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);

窃屏功能也很容易实现,只要座位号改为其他玩家的就可以显示其他玩家的游戏信息了。代码如下:

  seckill:=strtiint(edit1.text);
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);

Ok!代码写好了,下面编译一下进行测试吧,进入游戏之后再运行外挂,然后体验一下各项功能吧。我的秒杀效果如图11所示:


总结:


这个辅助程序比较基础,主要是通过分使用CE进行分析,获得游戏数据:座位号基址、时间基址、踩雷变化基址。这些地址都属于一级基址,比较简单。虽然简单,但是通过自己动手进行分析操作还是有一定收获的。如果继续开发,建议查找多级地址进行深入分析,比如道具数据和道具格子地址,以及道具使用call调用等,这样可以完成一些变态功能的开发,比如无限道具,无限加分等操作。在本文中使用修改座位号来进行秒杀的做法还是比较新颖的,利用游戏的这个bug来直接快速的实现秒杀功能。因此在外挂开发的实践中,一定要尽可能多的尝试,也许就会有意想不到的收获。



[课程]Android-CTF解题方法汇总!

最后于 2018-3-4 12:16 被cnsecurity编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (22)
雪    币: 1485
活跃值: (129)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
自抢沙发
2018-2-8 16:04
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
老铁。游戏外挂一般都需要什么知识?
2018-2-8 16:11
0
雪    币: 1485
活跃值: (129)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
软件调试+编程+脑洞大开
2018-2-8 16:17
0
雪    币: 466
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
开始学习中  。。。。。
2018-2-8 16:42
0
雪    币: 66
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看看估计需要好久才能理解
2018-2-8 21:01
0
雪    币: 407
活跃值: (566)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
从哪里复制过来  这么不用心  图都挂了
2018-2-9 00:44
0
雪    币: 1485
活跃值: (129)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
已经补图,sorry啦。
2018-2-9 15:33
0
雪    币:
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
棋牌外挂都需要什么知识呢?
2018-3-27 01:11
0
雪    币: 94
活跃值: (333)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
无语
2018-4-3 15:08
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
无语,too
2018-4-7 05:50
0
雪    币: 189
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
确实不是复制15年前的delphi外挂教程?
2018-4-9 08:38
0
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
delphi7  应该是古董了 
2018-4-9 21:02
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了,大佬大佬!!
2018-5-11 11:24
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看上去  好有趣
2018-5-11 11:56
0
雪    币: 303
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
确定  CE还能加载?转载的把
2018-5-23 10:07
0
雪    币: 216
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
。。。。还要加公众号。。。
2018-7-16 19:54
0
雪    币: 452
活跃值: (6128)
能力值: ( LV12,RANK:580 )
在线值:
发帖
回帖
粉丝
18
现在的基址有些没那么好找了 比如某训的 虽然挂还是满天飞 现在的传输都加密了 虽然破解的还是很多 但是现在网上的教程都是拿什么植物大战僵尸 单机跟联网 两个概念
2018-7-19 12:24
0
雪    币: 3
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢分享,看雪有你,春暖花开.
2018-10-8 01:50
0
雪    币: 143
活跃值: (468)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这么多年了,还能看到delphi,确实少见
2022-10-11 20:17
0
雪    币: 3
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
对抗来说 5E 还是弱了点    
2022-10-13 15:18
0
雪    币: 209
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
完美
2023-4-10 14:39
0
游客
登录 | 注册 方可回帖
返回
//