-
-
[原创]游戏漏洞挖掘之协议获取
-
发表于:
2017-12-28 10:15
4063
-
协议分析是游戏漏洞挖掘的关键,确定游戏的协议是漏洞挖掘的前置条件。游戏客户端与服务器间通过事先定义的协议进行通信。只不过通信的数据往往被加密后,难以从信道上直接获取有效信息。弄清楚数据打包的过程,便是协议获取的关键。打个不恰当的比喻,在未学习其他语言基本知识时,我们很难听懂外国人对话的,此时了解了加密过程,就好比将他们的对话翻译成国语,了解了序列号过程,就好比知道了他们的断句,有了可读懂的语言,再加上断句,我们就能清楚的知道他们每一句话的意思。协议分析也是这个道理,其分析的关键便是弄清楚明文数据和序列化过程。。
一般协议的明文buff分析,多从游戏的socket连接开始进行逆向分析,借助网络工具,可以清楚的了解到游戏使用的tcp/udp链接,然后针对性对send/sendto, recv/recvfrom下断点进行逆向。部分游戏因为自身的复杂性,可能会有多个socket连接,一般我们可以通过分析每一次数据交互过程,进一步确定游戏选择的是哪个socket进行数据传输。
为更加清楚的说明协议分析的过程,笔者选取一款游戏进行说明。首先通过net-peeker发现游戏仅仅采用了TCP链接,OD附加后直接对send下断,发现游戏有多个调用地址调用了call,于是分析每一次send的参数,当在游戏内进行网络操作时,拦截到如下截图
从上图可知,游戏中大部分数据传输选择了0x674这个套接字,进一步回溯堆栈,结合数据下访问断点,最终确认到游戏的明文发包函数
当获取到了明文buf点时,需要进一步分析游戏的序列化过程,不同的游戏采取的序列化过程也不相同:
有的会调用通用的序列化函数,如调用类似与write函数,向buf里传入写入的数据和参数
有的更为直接,直接调用类似与write_byte, write_word, write_dword, write_qword函数,不同的函数会写入不同的数据
还有的并没有直接调用序列化函数,而是传入了一个结构的指针,通过解析这个结构,就可以得到各个数据的偏移和大小。
分析思路上,基本都是在协议明文buf前后,进行回溯分析确定序列化过程。常见的如对数据buf下访问/写入断点后,再次进行堆栈回溯,或对明文发包点下断,堆栈回溯观看函数的调用顺序,也可以分析数据是如何进行填充和清空的,最终确定游戏的序列化过程。分析涉及到的逆向知识较多,这里不再一一描述。
*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)