游戏的账号保护、数据保护与盗号木马、外挂之间一直是一个持续对抗的过程,所谓是道高一尺,魔高一丈。没有一个绝对通用的方法能够抵抗所有的盗号木马以及游戏外挂,也没有那个盗号木马或者游戏外挂能够始终如一的实现游戏的破坏,二者一直处于一个动态平衡的状态。随着社会立法层面的不断提高,灰产也受到了一定的打击,但是由于其背后利益巨大,涉及到的面比较广,所以要想彻底覆灭是不太可能的,人性所致。
本文通过概括性描述,阐述较大范围内的通用防盗号/外挂的技术方案,并会根据设定的实现目标在后续文章中逐一实现一款较为通用的防盗号/外挂程序。当然,方案局限于需要键盘输入账号密码的游戏,对于严格app扫码直接登入的游戏安全属性已经很高了,我们不做讨论。
常见的盗号手段有以下几种:
1. 键盘窃听,通常使用全局键盘钩子或者驱动层面的键盘过滤驱动实现,很早之前的qq盗号木马等较为常见,目前针对主流游戏的也不太常见了;
2. 假输入框,恶意程序循环扫描窗口,在查找到目标游戏窗口之后(例如Steam、WeGame),会创建一个假的账号/密码输入框贴到原始窗口的位置,等待用户输入,进行账号信息截取;
3. 内存盗取,用户输入完毕账号、密码之后,在游戏进程内存中会残存账号与密码字符串信息,通过对特定的游戏分析,可以锁定大概的1个或者N个偏移位置,届时即可对用户的游戏进程进行枚举分析,以盗取账号密码。外挂必备;
4. 授权文件窃取,有些游戏在用户登录之后,会将用户的游戏授权文件存放到本地的摸个位置,这就为恶意程序的盗取提供了方便;
5. 网络截取,通过逆向分析游戏数据包,获取用户登录校验的加密包,并解密获取。目前国内流行的主流游戏来说,数据加密的强度还是很强的,对于使用了TLS的通信协议来讲,还需要建立本地的透明加解密代理,难度极大;
对于以上的5种手段来说,1-4都可以进行相对有效的应对,在后续的功能实现上,我们将优先实现2-4这3个防范措施措施,大致的实现思路如下:
1. 应对假输入框,通过设置进程回调,我们会发现关注的游戏进程组的启动,随后将该组游戏进程纳入窗口枚举的驱动保护清单,任何非组内进程对该组进程的NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserQueryWindow、NtUserWindowFromPoint、NtUserGetClassName API调用,一律进行拦截,并伪造返回结果;
2. 内存盗取,通过设置进程回调,我们会发现关注的游戏进程组的启动,随后将该组游戏进程纳入内存访问的驱动保护清单,任何非组内进程对该组进程的NtOpenProcess、NtAllocateVirtualMemory、NtReadVirtualMemory、NtWriteVirtualMemory API调用,一律进行拦截,并伪造返回结果;
3. 授权文件窃取,通过设置进程回调与文件过滤回调,仅允许游戏组内进程对游戏目录内的文件进行访问。该类方法还需要针对性的研究游戏(例如Steam),确认游戏授权文件的真实存储位置,以便针对性解决。