拆你妹的逗比路由器系列

新版本坑爹坑的惨无人道。。。。。。 从最初一开始的单一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路由器玩的可真不容易。。。