2024年1月27日发(作者:)

dnf封包协议加密分析

很早之前就逆向了DNF的通讯协议加解密算法,最近试了下利用其进行中间人攻击,并整理出此文。为防止对游戏环境产生影响,一些关键性技术细节已隐去。

使用Wireshark抓包,设置好捕获过滤器,拿到进入频道的封包

初步分析,前3个字节为封包类型,之后是4个字节的封包长度(带包头),然后是checksum。发送与接收的包头略有不同。

封包类型可以从客户端搜索"PACKET"字符串得到

从上文提到的ENUM_CMDPACKET_XXX等字符串入手,可以找到封包加解密的位置。

第一个封包是建立连接后服务端主动发送的ENUM_NOTIPACKET_CHANNELINFO,加密为简单的位移与异或。根据调试分析,内容为一些频道信息及后续封包加解密的key。

除了该密钥包的位移异或以外,DNF还使用了14种加密算法,对封包类型取余数决定使用哪一种。

根据密钥、block大小,配合Detect It Easy的“鲜明特征”功能可以快速定位每种加密算法。

封包解密后,仍会遇到一些问题:

1、一些封包解密后仍为乱码,内容开头为0x78

2、一些封包无法解密,封包类型为ANTIBOT与DPROTO相关

第一个很明显为zlib压缩的文件头,同时观察到封包头部最后一个字节为0x01,判断后用zlib uncompress解密即可。

第二个为国服的加密协议,没有走DNF自己的加密逻辑,不需要进行加解密处理,排除掉即可。

为了修改DNF的封包数据,我用c#编写了一个简单的socks5 server,并使用Proxifier让走自己设置的socks5代{过}{滤}理。