Dr.com校园宽带认证协议解析(一)

产品版本:5.2.0.201108191.A.W.100014
主模块:5.2.0.201108190.A.W.100014
通讯模块:0.7 (u62) Build(k9.20110815)
升级模块:5.2.0.201108190.A.W.100014
检测模块:5.2.0.201108190.A.W.100014
网际协议:IPV4
认证/封装方式:PPPoE  / 封装防代理
内网认证:已禁用

西安邮电大学学生宿舍上网方式分为两个阶段:

1.客户端使用PPPOE协议连接计费服务器

2.客户端与服务器使用Dr.com认证协议,确保通信双发的合法性

客户端封装防代理模块,防止多用户使用同一账号共享带宽资源。

使用路由器或者操作系统自带的PPPOE协议连接服务器,模拟实现Dr.com协议,便可绕过防代理模块实现共享上网。

通过Wireshark抓取官方客户端通信数据包

由上分析可知:

  1. 数据包周期间隔17秒左右,每个周期8个数据包
  2. 服务器IP地址为123.138.72.114,采用UDP通信,源端口、目的端口均为61440

通信间隔、周期分析

从Wireshark随机选取几组数据包,分析通信时间间隔

由上分析可知:通信周期为17秒,前4个数据包与后4个数据包有一定的时间间隔

可建立通信模型:

综上:发送前4个数据包后,间隔时间取值范围约为t=rand(5,13)秒,发送后四个数据包后,间隔时间为17-t秒。

UDP数据流分析

缩进部分为客户端接受到服务器的数据包,颜色标记为变化数据

上图左右两图可流纵向分析数据流,横向用于不同时间通信数据流比对

分析可知:

1.前4个数据包第二个字节呈现递增,后4个数据包第二字节呈现递增

0f->10    0d->0e    11->12    0f->10

2.第3、4字节为数据包长度,注意网络字节顺序

例如,第3个数据包是60 00->0x0060->96(十进制)

3.第5、6个字节是数据包序列,前四个数据包为一组(寻找、登陆服务器数据包),后四个数组包为一组(版本验证、保持在线数据包)

4.第3个数据包的第17、18、19、20字节,即00 63 00 0f(0xf006300)为保持在线,00 62 00 0f(0xf006200)为登陆时

5.图中红色、黄色、紫色标记需要根据服务器会送数据包进行下次发送数据包的填充内容

蓝色框中为校验码,蓝色标记为随机数,绿色标记为服务器版本号

6.校验码计算方法:

第3个数据包每四个字节为一组划分,按位作异或运算,结果异或0x200,异或0x1de4cbea,再乘以0x12c4b7e

第七个数据包每两个字节为一组划分,按位作异或运算,结果乘以0x2c7

7.其他部分填入固定字节即可

Dr.com协议数据包模型

第一、二数据包

第三、四数据包

第五、六数据包

第七、八数据包

校验码算法

随机选取第3个数据包

以前校验算法:

c3.dwChecksum = 0x1312FC7;
c3.dwUnk1 = 0x7E;
ptr_int = (int *)&c3;
dwChecksum = 0;
for(n = 0; n < 96/4; n++)
dwChecksum ^= *(ptr_int + n);
c3.dwChecksum = dwChecksum * 0x12C4B7E;
c3.dwUnk1 = 0;
//上面代码引用于MengXP源代码

现在逆向校验汇编代码

对比以前数据包和现在数据包,发现校验算法结果不能使用。结合汇编代码和以前的校验算法得知,算法中的加密常量改变了,只需修改即可适用。

校验算法修改方法:

1.0x1312FC7 替换成0x1de4cbea

2.0x7E 替换成  0x200

随机选取第7个数据包

这是第二处校验,对比以前和现在的数据,发现校验算法适用。

以前校验算法:

ptr_short = (short *)&up;
for(n = 0; n < 40/2; n++)
dwChecksum ^=*(ptr_short + n);
dwChecksum&= 0xFFFF;
up.dwChecksum = dwChecksum* 0x2C7;
//上面代码引用于MengXP源代码

逆向校验汇编代码

常见数据包接收问题

UDP为不可靠通信协议,在上述通信模型中,当某次数据包接收超时,若是前四个数据包应该终止此次通信,跳转至开始;若是后四个数据包应该跳转至第五个数据包处。

套接字打开方式应为:非阻塞,并设置接收超时时间

Linux Windows
fcntl() 可用于设置套接字为非阻塞 ioctlsocket() 控制套接字的模式
select()  可用于设置接收超时时间 select()  设置接收超时时间

声明:本次分析数据通过Wireshark抓包,参照与MengXP的源代码

posted @ 2013-08-22 12:19  雨中尘埃  阅读(1572)  评论(0编辑  收藏  举报