拆你妹的逗比路由器系列

新版本坑爹坑的惨无人道。。。。。。

从最初一开始的单一Authorization标头验证,到后面换汤不换药改成cookie验证,再到现在动态ID验证。。。

我只能说这个B装的真不容易。。。。。。T T

话不多说,其实你一开始要我去看一个路由器的验证方式我是拒绝的,你不能让我看我就马上看,首*&^%^&%&%&^

最开始的路由器使用的是验证HTTP标头,使用HTTP-HEADER的Authorization字段,内容为 “Basic “+Base64(用户名:密码)

如果匹配的话可以正常进入,否则会由于返回401错误无法通过。浏览器弹窗要求用户名密码也是这个原因。

后面呢这些厂商发现这玩意儿好像不太好玩,登陆就弹窗,而且这么多年了估计早就被人摸透了,顺便那啥,我们的界面要与时俱进,开拓创新嘛,对不对,于是路由器固件又改了下,就有了下面这种

QQ截图20150320204131(改版后的路由器固件,与前面的老版本相比仅仅修改了登录方式和登录界面,所以说是换汤不换药)

我从一开始拿到的路由器就是这种固件,当时在CSDN找到的文章给的验证方法是旧版本的,也就是标头验证,结果死活不对,正当我心灰意冷不停开关F12的时候我在Chrome的开发工具里面找到了点东西。。。

QQ截图20150320204431

 

从标头转移到了Cookie,内容都没变,你大爷的。。。

于是兴致冲冲改完程序,嗯,成功。以为水星和TP的应该是通杀了。

万万没想到的是,去年有学弟发了张图,TP-WR842N的,但是固件改掉了。全新的界面。说用不了。我心想这东西应该也是差不多换汤不换药吧,就说谁愿意借我我来试试,结果没人回应(= =|||),于是不了了之。直到前段时间有个哥们儿找我说MW313R也用不了

我说不应该啊。。。这尼玛怎么也会。。。

然后只好为难那个哥们儿帮我抓了下网页的东西。。。。。。结果分析了半天什么有价值的都没有。就连上版本隐藏在JS里面的BASE64编码密码的代码都没见到

我擦,你特么在逗我。。。。

想了想说家里可能要换下路由器了,于是就自己买了个。

拿回来开始拆JS。。。不过刚上手拆JS就感觉被水星的程序猿教育做人了

QQ截图20150320205006

啥,头晕了?眼花了?没什么!关键是拆了格式化以后的东西。满满都是逻辑运算替代控制if else,逗号运算控制执行顺序。

只好从Chrome事件下断点。不然这看到猴年马月去啊。。。

点击登陆的箭头以后,先是指向了一个 $.orgAuthPwd函数,f11跟进去,跳到了一个函数名安全编码的地方。既然是安全编码,应该就是这里了,我是这么想的。然后追了一下,发现这里的却是算法。整理了一下以后是这样的

 

securityEncode = function (a, b, c) {
    var d = "", e, f, h, m, k = 187, l = 187;
    //短码长度
    f = a.length;
    //原密码长度
    h = b.length;
    //长长度
    m = c.length;
    e = f > h ? f : h;
    for (var g = 0; g < e; g++)
        l = k = 187,
        g >= f ?
        l = b.charCodeAt(g) :
        g >= h ?
        k = a.charCodeAt(g) :

        (k = a.charCodeAt(g), l = b.charCodeAt(g))
        ,
        d += c.charAt((k ^ l) % m); return d
   };

 

我不会告诉你原来的文本里面就是一条代码,逗号隔开的。。。。。。。。= = 光理解这段东西都让我蛋疼欲死。
解释一下,这段代码中,a,b,c三个参数分别为短验证码,原始密码,长验证码,其中ac两个长短验证码当时未知,b是用户输入的密码。
然后继续拆JS。。。Chrome的断点调试给了一个值,把JS扒下来以后搜索一下,嗯,有了

this.securityEncode(a, "RDpbLfCPsJZ7fiv",
"yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro
510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW")

 

哎哟卧槽,这么容易就被我找到了?我倒蛮高兴的,滚回去,改代码,测试
于是程序给我返回了一个401.没错,验证失败了
难道不对?
然后继续拆,但是拆了半天没头绪,大约两个多小时以后我觉定从开始加载的部分再看一次,这次直接追到了一段代码

 

this.pageOnload = function () {
var b = [
    { tag: "link", url: "../dynaform/menu.css" },
    { tag: "link", url: "../dynaform/DataGrid.css" }
    ], a = [
    { tag: "script", url: "../lib/verify.js" },
    { tag: "script", url: "../dynaform/macFactory.js" },
    { tag: "script", url: "../dynaform/DataGrid.js" },
    { tag: "script", url: "../dynaform/menu.js" }
    ];
this.loadExternResource({
scripts: [
    { tag: "script", url: "../lib/jquery-1.10.1.min.js" },
    { tag: "script", url: "../lib/model.js" },
    { tag: "script", url: "../lib/DM.js" },
    { tag: "script", url: "../language/cn/str.js" },
    { tag: "script", url: "../language/cn/error.js" },
    { tag: "script", url: "../lib/Quary.js" }, {
    tag: "script",
    url: "../lib/ajax.js"
}],
callBack: function () {

    $Init();
    $.setexternJSP(replaceJSP);
    $.setExternPageHandle(loadPageHandleBg);
    $.setLoginErrHandle(showLogin);
    $.setPRHandle(pageRedirect);
    window.authInfo = [];
    this.loadExternResource({ scripts: a, links: b });
    this.compatibleShow();
    this.localSgInit();

    this.loadPage("Content.htm", "Con")

    }
});

 

注意最后一行,这玩意儿加载了一个页面,但是好奇怪,这东西有没有用到HTML框架,加载了什么玩意儿?
滚回Chrome抓包,然后这玩意儿现了真身。。。。。

00007
00004
RAcrvGCPsJ34j7
<长验证码>………
00000

(p.s 这里是示例我所抓到的内容,路由器返回的数据的却是这个格式,第三行为短验证码,第四行为长验证码,并且长度似乎总是255)
然后突然想到是不是这玩意儿加密过了?试了下还是错的。
难不成我算法错了?
考虑到时间不早,加上还要改BUG,那天也就没有继续了,存好了算法代码和设置账号密码的格式以后就滚去睡觉了。

直到昨天晚上心血来潮说再试一次。
这次直接从验证部分下断点,我先分析下算法是不是错了。。。。结果计算出来的ID是一模一样的。。。。
shenm me gui?
继续执行,按了N次F11以后,又莫名其妙跑到了安全编码部分。
这参数,这id,你大爷的这不是刚刚算出来的ID嘛?验证码呢?authInfo出一遍,好家伙,一样的。。。。。。
难不成两次加密?好吧,改代码试试。
然后simpnk返回了登陆成功。。。。。。。
于是我的表情是这样的
QQ图片20150320211443

 

设置好参数,调好BUG,还有请求头。。。。。。

嗯,总算设置成功了。发给那个哥们儿,过了不久那哥们儿也用上了(顺便吐槽下,凭什么别人家的学校动态密码不断网,唯独皇家理工有这种特殊待遇啊,操操操,虽然我已经转投移动了,不过CMCC治好了我多年的老网瘾不说。。。)

然后等到我晚上自己设置的时候,NND,验证失败。看了下账号,账号出现的空格全部成了+号。。。(我把账号URL编码过,不然路由器不认,万万没想到这玩意儿居然更不认)

然后自己试了下账号密码带空格,发送的数据中空格被替换成了 %20

%20。。。等等。。。我记得我以前写的好像是%2D。。。。。

我特么终于能理解为什么最近小伙伴问我说怎么设置不了路由器了。。。我特么把空格的编码记错了

这是何等的卧槽 = =|||

滚回去替换编码,OK,万事大吉。总算可以用了。

只是路由器界面账号为空简直感人(其实是因为账号文本问题,账号前面有换行,但是路由器识别数据也是靠换行,于是账号就凭空消失了。。。。)

这个B路由器玩的可真不容易。。。

 

4 thoughts on “拆你妹的逗比路由器系列

  1. %20那个错误。。。我说怎么有时候能连、有时候几次都连不上提示账号密码错误。。。

发表回复

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