Battle.net v2 登录协议分析 1

来源:互联网 发布:网上淘宝兼职刷信誉 编辑:程序博客网 时间:2024/04/30 14:13

网易开放魔兽世界内测后,我迫不及待地试图按照以前九城的老方法用美服/台服客户端连接大陆服务器。未想,网易竟然在登录服务器上进行了特殊限制,阻止了非大陆客户端的登录。我承认那天晚上我等到12:30却始终看到客户端报版本错误的时候十分郁闷…

第二天,在mop,nga等地陆续看到有人发帖子请教如何用非大陆服务器客户端登录大陆服务器。为此,我进行了一些研究。碰巧在mop上碰到一个和我做了同样初步分析的人(raptium,他的Blog:http://www.raptium.net/),隧联系之,一起分析这种情况。

我们当然可以认定,网易在服务器上做的设置是“特殊的”,“全球唯一的”。因为美服欧服台服之间完全可以互相登录。抓包分析表明,当前版本的魔兽世界(3.1.3.*)会使用两种登录协议。一种是传统魔兽世界认证协议,一种是Battle.net认证协议。前一种已经被分析得差不多了,甚至Wireshark都认得,后者基本还没有相关文档。当客户端发现所输入用户名符合email格式时,会启用Battle.net登录协议。此时,在realmlist.wtf中设置的realmlistbn会起到认证服务器的作用。反之,会使用传统魔兽世界认证协议,使用realmlist.wtf中设置的reamlist字段的服务器作为认证服务器。

目前,美服,欧服的Battle.net并不是强制绑定的,台服还没有Battle.net,只有大陆服务器是强制绑定。

经过分析,我们认为客户端首先向服务器发送的第一个报文中,包含版本信息。经过对大量实验结果的diff,我们得到如下结论:

第一个报文被称之为AuthChallenge(有一篇很好的文章,作者在我们之前对Battle.net新版认证协议进行了分析。虽然没有我们透彻,但他却为我们解释了一个十分重要的数据,这个数据可能是通过反汇编得到的,也可能是经过大量diff后得到。它为我们节省了大量时间。原文请见:http://www.deviange.net/wow-clients/login-protocol/。 注:大陆地区无法访问。再注:该文中称第一个报文为AuthRequest),其中包含了将要登录用户的名称,游戏的四个版本,可能还包含游戏平台信息。

offset 0×00处必然为0×00,应该是一个cmd,表示这是AuthChallenge。

offset 0×19和0×20处为wow.exe的版本。对应于connection.log中的 Component WoW.Win. 。值:9974:6D 01,10146:D1 00

offset 0×24和0×25处,为Data目录的版本,对应于connection.log中的 Component WoW.base. 。值:9947:6D 01,10146:D1 00

offset 0×31和0×21处,为Locale目录(如Data/enUS,Data/zhCN)的版本,对应于connection.log中的 Component WoW.enUS. / Component WoW.zhCN. 等。值:9947:6D 55,10146:D1 54

offset 0x2C,0x2D和0x2E应该表示客户端语言信息,对应于connection.log中的 locale= 。这一处仍存在疑问。

因为大陆客户端的特殊性(AuthChallenge报文比其它客户端要长),我们暂时无法解释多出来的数据。以上内容均以美服客户端为参照,欧服台服应该是一样的(台服已验证)。

报文最后是用户名,用户名前两个字节是用户名的长度。这里使用了特殊的计算方法。如果长度不对,登录报文将被拒绝。计算方法上面所提到的文章中有详细说明。感谢那篇文章的作者 David Liu 。没有他,我们是不会研究到这一步的。

这个报文中很可能还包括游戏的名称,游戏运行平台等信息。条件所限,我们暂时没有解析出它们。

登录第二步,服务器端发送给客户端一个很大的报文,称之为AuthServerProof(David Liu 的文章中称为AuthChallenge)。其中前6个字节是固定的,为 42 10 61 75 74 68 。这可能是用户名验证通过的意思。offset 0×08,0×09处是服务器语言代码,如US,CN等。offset 0xF3,0xF4处是同样的信息。offset 0x0A到0x2C处为固定字符。所有服务器均相同。0x2D到0x6C处的64字节,可能是某种散列。对于相同的服务器,它是相同的,不同的服务器则不同。

随后,offset 0x6D到0xEC处的128字节,每次登录均不同。可能是服务器发来用作加密密码的RSA Public Key。offset 0xED到0×116处,是一段固定数据。从0×117开始,直到报文结束的512字节,对于相同服务器来说它是相同的,不同的服务器则不同。

raptium试着把客户端的realmlist.wtf中realmlistbn的值改为127.0.0.1,在本地架设服务器。客户端发送AuthChallenge时,一切正常。但是当我们的服务程序把暴雪Battle.net认证服务器的AuthServerProof发送给客户端后,客户端却“礼貌地”用FIN中断了连接,并提示“invaild server”。raptium认为这可能是服务器端发送的AuthServerProof中存在某种校验的缘故。raptium把自己的IP改成官方认证服务器的IP,并发送暴雪Battle.net认证服务器的AuthServerProof,没有出现任何问题。这便印证了他的猜想。我们又尝试用无效数据填充第一个未知的64字节数据,依然可以通过认证。这说明最后的512字节数据中很可能存有某种服务器身份校验数据。这512字节,替换任何一个字节都会导致认证失败。

我们正在进行进一步研究分析。反汇编是必需的。希望有熟悉反汇编的朋友帮助我们。


http://bear.freebearblog.org/archives/141