srun3000协议简析及php登录示例

一直想让路由器也用上srun3000,但是不知道协议,我们这又关闭了web认证方式。后来google到了一些文章,通过实验,基本可行,现在我来总结、简析一下。

srun3000这个东西有个网页认证方式,就是连上网后,随便打开一个网页,就会自动跳转到一个网页,像cmcc那样。这个网页有可能是个登录界面,那么登录即可。可惜我们这不是的,而是一个信息页面,可以下载客户端。但是如果用手机打开,就会跳转到mobile.html,这个是个登录界面,但是输入正确的用户名密码之后,提示不允许web登录。

web登录是向认证服务器post一段数据,后来抓包发现,客户端也是post这段数据,只不过有些值不同,密码也经过了处理:

username=%s&password=%s&drop=%d&type=2&n=%d&mac=%s

数据中username是用户名,password是密码,drop是是否只访问免费资源(1是,0否),type代表认证方式(1为web,2为客户端),n代表客户端版本(我这是8),mac当然是mac地址了

web方式password是明文,而客户端方式是加密了的。加密方法是这样:

有两个字符串,一个password,一个key,设password 为 12345678,key为 20678439。

逆序循环取key的字符,也就是 9,3,4,8,7,6,0,2,9,3,…
分别与password 的 [0], [1], [2] … 直到password结束 进行异或运算
对于结果,一个字符

[0],[2],….[2n]的字符,译码之后:(低4位 加上 0x36 )连上 (高4位 加上 0x63)
[1],[3],….[2n+1]的字符,译码之后:(高4位 加上 0x63)连上 (低4位 加上 0x36 )

然后连接之后的结果就是提交的密码的密文

提交的时候,用 urlencode或类似的函数处理这段数据。其中key与服务器时间戳有关系,详情可参考此处

搞定密码加密了,就可以实现登录了。向认证服务器的3333端口post上述数据即可,服务器会返回数据。php代码如下:

下面是登录了,请参考注释。

登录成功后服务器会返回几个数字,有一个是用户uid,一个是服务截止日期的时间戳。至此,网络上相关srun3000的研究就这些,还有一个比较完整的php类可以使用,上面还有注销,查询用户信息等协议,点击查看

登录之后,我发现有个问题,20多分钟后就会掉线。有一个向服务器的/cgi-bin/keeplive路径不断post uid的方法,但针对的是web认证方式,客户端登录还是会掉线。通过对抓包发现,客户端每格3分钟会向服务器的3335端口发送一个udp包,我用php模拟之后确认是用来保持在线的,但是这段数据每个用户名不一样,也是加密的,加密算法还有待研究。下面这段php是用来模拟udp的,需要socket库支持。

通过上面的分析,基本可以自己编写客户端了,什么web,exe,android,只要会都能做出个客户端了。我使用的是openwrt的路由器,安装php环境,这样路由器就可以自动登录srun3000,共享网络了。

update:

已经找出保持在线的算法,简单说明下。向服务器3335端口发送的udp包是根据uid算出来的:

把uid转换成16进制,然后从末尾开始每两位分割,把整个数字倒过来,然后在末尾加上0000(最后是16位的),最后的结果是以每两位作为一个ascii字符的字符串。
比如uid为10153302696068,转换成16进制是93C00002084,最后的结果是 $keepstr=’\x84\x20\x00\x00\x3C\x09\x00\x00′

代码我就只写个字符串的算法,其他代码自己写,uid也自己获取吧。

 

《srun3000协议简析及php登录示例》上有8条评论

  1. 可惜了,虽然我这个编程的门外汉也基本了解了srun3000的登录机制,可惜因为不会写代码,没办法让android平台的手机、平板也能用上自己的windows平台上使用的帐号。

  2. 很厉害,加密方式都被你搞定了!参考的文章非常有价值,早知道有这个PHP类,我还写啥呢,囧!
    p.s. 我们学校有一个type=3的登陆方式,是特别给linux登陆的,我利用的是这个type,我们这边web登陆的type=1,你对参数的了解也很详细,非常强大。
    p.s.2 能不能求解一下如何给openwrt设置crontab?我设置了crontab总是不来事…好郁闷…

    1. crontab和linux的完全一样。我是在luci里直接设置的,在服务-计划任务里。比如我保持srun3000在线用的命令是:
      */5 * * * * /usr/bin/php-cgi /www/wwwroot/keep.php > /dev/null 2>&1
      也就是每5分钟运行一次。执行后在系统日志里有信息。

  3. 你好,看了你的文章,确实有了很多思路,但是没学过php,现在去学估计也够呛,能不能给个完全一点的php登陆页面,或者做一下具体点的介绍,感激不尽

发表评论

电子邮件地址不会被公开。 必填项已用*标注