首页
社区
课程
招聘
[原创]对反游戏外挂技术的思考及实现
发表于: 2020-7-1 09:52 15817

[原创]对反游戏外挂技术的思考及实现

2020-7-1 09:52
15817

现如今,有很多游戏外挂软件,它们可以修改游戏显示的数据和内部代码,来达到谋取利益的目的。在实现反外挂技术前,我先介绍一下常见的三种外挂:
1.模拟类外挂:该外挂可以说是最早的外挂了,它是往游戏发送伪造的按键消息来模拟人的手工操作。实现的思路为:

2.内部Call调用外挂:使用逆向技术分析出游戏内部的汇编代码,把里面对游戏玩家有利的函数作为外挂的实现功能。实现的思路为:

3.脱机外挂:分析出游戏客户端和服务端之间的通信逻辑,使用自己发送和接受数据来跟服务端进行交互。实现的思路如下:

1.最近玩植物大战僵尸和连连看等游戏的时候发现,这些游戏需要通过启动程序才能正常运行,那么我突发奇想,如果在程序运行前,修改游戏中的部分代码段数据,等需要运行游戏时再通过另一个程序恢复代码段数据,那么就可以起到保护游戏的作用。

2.对于游戏外挂制作者,他们经常习惯性的使用OD工具和CE工具、ida工具等,找出游戏的基址数据(也为全局变量)和内部call,然后修改基址数据或者修改执行流程,调用内部call。那么在游戏运行前就对基址数据地址和某些call后接地址进行修改,等需要运行游戏时,再修改回基址地址和call调用的地址,就可以起到反外挂的作用。

3.接下来,介绍一下这样做的作用:

4.简单介绍一下实现的流程:1.读取PE文件信息到内存中,遍历PE文件中的代码段,找到函数头部地址和使用的全局变量地址;2.在代码段中,找出调用函数的call指令,把call后接地址进行修改,对于数据,找到使用全局变量的mov指令,修改地址操作数;3.运行时,使用CreateProcess函数创建线程并挂起,然后恢复代码段中的数据并运行进程

5.我开发了一款反游戏外挂工具(该工具及其源码可在文章末尾下载)来模拟这个过程,在文件选择框选择要保护的PE文件,把需要保护的函数及数据添加到左边栏中,执行保护时,在PE文件目录下会生成已保护的PE文件,点击运行时,就能正常运行。

1.在游戏没有运行之前,修改、添加或删除PE文件的二进制信息可以起到修改程序流程的作用,从而起到外挂的作用。实现的技术有:在代码段的空白区域添加"洞穴代码",修改OEP的值,让程序跳转到洞穴代码;使用Inline HOOK执行外挂功能函数;修改代码段中的跳转指令和call后接地址,执行游戏内部汇编指令或者调动内部call等

2.在游戏运行时,通过外挂工具动态修改、添加或删除进程代码段数据或者动态注入shellcode同样也能起到修改程序流程的作用,那么需要校验PE文件和游戏内存数据就可以检测出游戏外挂。

3.在实际运用中,可以计算出PE文件的校验值,存放在游戏第三方程序的数据段中或者存放在游戏的服务器端,那么在游戏运行前校验PE文件值和运行时动态检验进程内存,接下来使用工具来模拟这个过程:1.选择PE文件计算PE文件校验值和记录代码段数据;2.选择需要校验的文件,同样也计算出校验值并比较是否变化;3.选择正在运行的进程,比较代码段数据是否变化。

4.实现的思路为:1.使用MD5算法计算出前后PE文件的校验值,并进行比较;2.先使用数组存放PE文件代码段数据,后读取进程内存中的代码段数据,然后比较数组数据是否相同

5.在游戏运行时,把游戏运行过程中使用过的函数及其相关的寄存器信息存放在服务端,在服务端检测函数的调用流程,就可以判断游戏内部call有没有非法调用。不过我这里模拟这个过程的方式是把函数运行时的信息写到日志文件中,查看日志信息来判断游戏内部call是否被非法调用。

6.实现的思路为:1.调式进程,循环接受调式事件;2.在刚开始调式时,把函数头部修改为CC;3.当发现中断时,判断发生中断的地址是否为函数头部地址,是的话,把线程上下文信息记录在日志文件中

1.现在,有各种各样的HOOK技术,包括 InLine HOOK、IAT HOOK、API HOOK等,其中大部分需要注入dll来实现HOOK功能,那么游戏运行时,服务端或者游戏第三方程序可以检测有无dll注入,有的话,及时清除掉。实现的思路为:1.先记录游戏运行过程中用的dll文件名;2.游戏运行时遍历进程使用的dll文件名,若遇到不名dll文件名,则进行释放;

2.使用工具模拟这个过程:选择进程,选中dll文件所在目录,点击检测dll,就可检测出进程中是否有dll注入。

3.那么,除了检测dll文件外,还可以检测 IAT表和函数内部代码的跳转指令来判断游戏中是否有IAT HOOK或者InLine HOOK(跟API HOOK差不多,范围比API HOOK小,我这里就不介绍了),实现的过程为:1.选中游戏PE文件后,定位到导入表目录,遍历INT表中的_IMAGE_THUNK_DATA,通过里面的联合体u1,来获取游戏运行后IAT表中的函数地址;2.选中进程,读取进程内存中IAT表信息并比较函数地址,不同则说明有 IAT HOOK;3.对于InLine HOOK,读取进程代码段中函数区域的跳转指令操作数,若发现跳转到别的函数区域,则说明有InLine HOOK;


4.使用工具模拟这个过程:选中进程和PE文件,再点击 IAT HOOK按钮或者InLine HOOK按钮就可进行检测。

1.现在的打金工作室可以同时开多个号来刷金币,那么需要限制游戏多开,当动态调式进程时,在任务管理器中可以看到调式工具的主线程成了调式进程,那么调式器内存里面必然会有调式进程的内存信息,那么找到调式工具后再查找里面是否含有游戏进程的内存信息,若有则可以判断,游戏处于调式状态。

2.对于防多开,经常会用到下面的代码,那么外挂制作者修改跳转指令或者NOP掉汇编代码就可以实现多开。为了防止这种情况,我这里把CreateMutex函数头部修改为CC,使用调式器的方式不断监控异常事件,当CreateMutex函数头部触发中断异常时,获取互斥体变量名(地址为:ESP+8),并判断该变量名是否出现过,若出现过,则检测出进程出现多开。实现的关键代码如下:

检测多开的关键代码:

3.对于多开检测,我还想出了三种检测方法:1.获取进程代码段信息,使用代码段信息匹配的方式来判断是否有相同的进程运行;2.获取进程所有的窗口句柄,匹配查找有无跟窗口标题相同的窗口,有则说明多开;3.对进程名进行匹配;


4.对于调式工具检测,还是使用代码段识别法:获取OD工具中代码段信息匹配寻找相同进程,若有,则再识别内部有无游戏进程的内存信息并且再判断调式进程是否为调式工具的子进程,两者有一成立,则说明游戏进程处于调式状态,实现的关键代码如下:

5.接下来,使用工具进行检测:多开检测只需选中进程点击“多开检测”按钮即可;调式工具检测要选中进程和调式工具,操作情况如下所示:


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

收藏
免费 14
支持
分享
最新回复 (35)
雪    币: 14530
活跃值: (17548)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
mark,楼主辛苦了
2020-7-1 09:58
0
雪    币: 3181
活跃值: (1801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持
2020-7-1 10:04
0
雪    币: 75
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2020-7-1 10:14
0
雪    币: 796
活跃值: (2044)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以,比那些长篇大论的废话水字数的帖子好太多了
2020-7-1 10:21
0
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2020-7-1 13:40
0
雪    币: 3710
活跃值: (2669)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
7
lz,现在有些输入法软件会注入dll到游戏,这个怎么判断是否合法dll?
2020-7-1 14:30
0
雪    币: 6124
活跃值: (4661)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
yegu lz,现在有些输入法软件会注入dll到游戏,这个怎么判断是否合法dll?
数字签名在不在有效期
2020-7-1 15:01
0
雪    币: 3710
活跃值: (2669)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
9
黑洛 数字签名在不在有效期
能否说详细一点?
2020-7-1 17:01
0
雪    币: 6124
活跃值: (4661)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
yegu 能否说详细一点?
意思是你没有办法准确的判断这个后缀为ime的dll是不是真正的“输入法”,所以你只能验证他的数字签名是不是属于主流的有输入法产品的公司,且数字签名合法有效。
2020-7-2 00:51
0
雪    币: 3710
活跃值: (2669)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
11
黑洛 意思是你没有办法准确的判断这个后缀为ime的dll是不是真正的“输入法”,所以你只能验证他的数字签名是不是属于主流的有输入法产品的公司,且数字签名合法有效。
了解了,多谢。
2020-7-2 09:15
0
雪    币: 12356
活跃值: (5879)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
黑洛 数字签名在不在有效期
nvidia某些dll没有签名,用数字签名判断是不是合法dll过于一刀切
2020-7-2 10:18
0
雪    币: 6124
活跃值: (4661)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
13
hhkqqs nvidia某些dll没有签名,用数字签名判断是不是合法dll过于一刀切
md5白名单,而且别人问的是ime
2020-7-2 20:05
0
雪    币: 151
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
长知识了 感谢楼主精彩的文章!
2020-7-3 15:21
0
雪    币: 202
活跃值: (228)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
谢谢
2020-7-3 20:51
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
楼主  那游戏的驱动层一般会做哪些保护 
2020-7-3 21:52
0
雪    币: 4709
活跃值: (1575)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
17
mark
2020-7-4 00:32
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark
2020-7-4 07:33
0
雪    币: 7360
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2020-7-4 07:41
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
20
A 点检查,B点爆发
服务器关联。
2020-7-4 10:13
0
雪    币: 269
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
很不错的思路哎,学到了
2020-7-9 10:25
0
雪    币: 134
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
厉害了
2020-7-10 15:22
0
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
厉害了厉害了
2020-7-11 02:15
0
雪    币: 3023
活跃值: (2477)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
24
大佬厉害了
2020-7-11 17:28
0
雪    币: 128
活跃值: (977)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我想说:楼主说 现如今,游戏辅助工具横行霸道,严重损害了游戏的公平性,
 游戏有公平性吗? 人民币玩家和普通玩家都在一个世界玩,哪有公平性
2020-7-24 16:33
1
游客
登录 | 注册 方可回帖
返回
//