Battle.net v2 登录协议分析 2
whitebear
花了整整两天时间反汇编wow.exe,略有成果。当然,在将来的分析中,这些资料很可能会是无用的,甚至错误的。但是我现在仍然将它们记录下来,以备以后需要。
简单的密码学扫描证明,Battlenet.dll有SHA1,MD5和DES的算法签名。wow.exe多了CRC和Tea。我在Battlenet.dll中看到了类似于AVRSAPublicKey的字符串,因此推断它也使用了RSA算法。
一下所有分析均采用美服9947客户端+大陆服10146 Wow.exe。
offset 0x00460FF0 处调用了W32库的send()函数。实验证明,在每一次向Battle.net认证服务器发报时,都会调用这一处。在此下断,ECX指向的内存地址即为即将发出的报文,EDI中为报文长度。
offset 0x004605B2 处调用了recv()函数。每一次Battle.net认证服务器向客户端发报时,这一处均会被调用。在此下断,EAX指向的内存地址即为收到的报文。
这两处内存地址是永远固定的。故在登录时dump WoW.exe内存,会在固定位置发现报文。
我尝试在收到服务器端AuthServerProof后,在AuthServerProof所在内存处下内存访问断点,成功在0x00411318处断下。但这会导致wow.exe崩溃。在后续测试中,我尝试在收到AuthServerProof后在该处下常规的int 3断点,程序依然会被断下,且没有发现任何问题。但是从此往后的分析却陷于停顿。程序似乎调用了大量MMX指令,疑为反调试。但因为WoW.exe本身是一个多媒体应用程序,具体这些指令是不是反调试代码,在进行进一步分析前也不好定论。
后来我尝试按照connection.log中的日志记录分析字符串。很快便在offset 08E979B找到了显示LOGON_BAD_SERVER_PROOF字符串的函数,它位于一个多达216种情况的switch…case语句中(offset 0x008E9776)。这个语句所在子程序开头处受到四处调用。这四处调用该函数的函数均为错误处理函数。我认为,这四处函数负责对错误代码进行大致处理,分出错误所属大类,offset 0x008E9776 处的函数是下一级错误处理,负责显示具体的错误信息。这四处调用中,Offset 008E9565处可以直接断下,该处函数开始自offset 008E9540。这里依然受到四处调用。依次上溯,大致可以找到3级错误处理。在最上一级错误处理函数的开头,反汇编程序就找不到调用来源了。我会对此进行更进一步的分析。
当然,这些函数调来调去,完全把我搞晕了…我不保证真的存在3层错误处理。很可能是互相调用造成的假象。
我的思路是继续上溯,直至找到导致LOGON_BAD_SERVER_PROOF的来源。报文中,这是一个长512字节的,一个字节都不能改的数据。这很可能会是一个散列,但我确实没见过如此长的散列。如果是散列,那么应该可以找到cmp。此时就可以看到正确的ServerProof了。继续上溯甚至可以找到算法。若不是散列(基本不可能),那么应该可以找到解码代码,分析之便可得到正确的制造该处报文的方法。