新版本坑爹坑的惨无人道。。。。。。
从最初一开始的单一Authorization标头验证,到后面换汤不换药改成cookie验证,再到现在动态ID验证。。。
我只能说这个B装的真不容易。。。。。。T T
话不多说,其实你一开始要我去看一个路由器的验证方式我是拒绝的,你不能让我看我就马上看,首*&^%^&%&%&^
最开始的路由器使用的是验证HTTP标头,使用HTTP-HEADER的Authorization字段,内容为 “Basic “+Base64(用户名:密码)
如果匹配的话可以正常进入,否则会由于返回401错误无法通过。浏览器弹窗要求用户名密码也是这个原因。
后面呢这些厂商发现这玩意儿好像不太好玩,登陆就弹窗,而且这么多年了估计早就被人摸透了,顺便那啥,我们的界面要与时俱进,开拓创新嘛,对不对,于是路由器固件又改了下,就有了下面这种
(改版后的路由器固件,与前面的老版本相比仅仅修改了登录方式和登录界面,所以说是换汤不换药)
我从一开始拿到的路由器就是这种固件,当时在CSDN找到的文章给的验证方法是旧版本的,也就是标头验证,结果死活不对,正当我心灰意冷不停开关F12的时候我在Chrome的开发工具里面找到了点东西。。。
从标头转移到了Cookie,内容都没变,你大爷的。。。
于是兴致冲冲改完程序,嗯,成功。以为水星和TP的应该是通杀了。
万万没想到的是,去年有学弟发了张图,TP-WR842N的,但是固件改掉了。全新的界面。说用不了。我心想这东西应该也是差不多换汤不换药吧,就说谁愿意借我我来试试,结果没人回应(= =|||),于是不了了之。直到前段时间有个哥们儿找我说MW313R也用不了
我说不应该啊。。。这尼玛怎么也会。。。
然后只好为难那个哥们儿帮我抓了下网页的东西。。。。。。结果分析了半天什么有价值的都没有。就连上版本隐藏在JS里面的BASE64编码密码的代码都没见到
我擦,你特么在逗我。。。。
想了想说家里可能要换下路由器了,于是就自己买了个。
拿回来开始拆JS。。。不过刚上手拆JS就感觉被水星的程序猿教育做人了
啥,头晕了?眼花了?没什么!关键是拆了格式化以后的东西。满满都是逻辑运算替代控制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返回了登陆成功。。。。。。。
于是我的表情是这样的
设置好参数,调好BUG,还有请求头。。。。。。
嗯,总算设置成功了。发给那个哥们儿,过了不久那哥们儿也用上了(顺便吐槽下,凭什么别人家的学校动态密码不断网,唯独皇家理工有这种特殊待遇啊,操操操,虽然我已经转投移动了,不过CMCC治好了我多年的老网瘾不说。。。)
然后等到我晚上自己设置的时候,NND,验证失败。看了下账号,账号出现的空格全部成了+号。。。(我把账号URL编码过,不然路由器不认,万万没想到这玩意儿居然更不认)
然后自己试了下账号密码带空格,发送的数据中空格被替换成了 %20
%20。。。等等。。。我记得我以前写的好像是%2D。。。。。
我特么终于能理解为什么最近小伙伴问我说怎么设置不了路由器了。。。我特么把空格的编码记错了
这是何等的卧槽 = =|||
滚回去替换编码,OK,万事大吉。总算可以用了。
只是路由器界面账号为空简直感人(其实是因为账号文本问题,账号前面有换行,但是路由器识别数据也是靠换行,于是账号就凭空消失了。。。。)
这个B路由器玩的可真不容易。。。
%20那个错误。。。我说怎么有时候能连、有时候几次都连不上提示账号密码错误。。。
那个应该算是我一个比较坑爹的失误了,我应该是把字符看错了。%20和%2D
辛苦辛苦
不错的经历!!!