最近家裏換了個TP的無線路由器,鼓搗鼓搗WEB登錄原理,不得不說TPLink這中無線路由器功能雖然沒有openWRT那麼多功能,但是麻雀雖小五臟俱全,對普通人來說很實用
話不多說,開整:
簡潔的界面:
看看源碼,這裏可以看到應用了個名字爲class.js的JS文件(加密算法在這)
我操,更簡單,,,連輸入框和按鈕都沒有,估計使用JS生成的了
接下來抓個包來看看,看是怎麼登錄的
可以看到點擊登錄按鈕後,輸入的密碼將會被加密輸送,認證通過後獲取一個類似令牌的字符,然後就登進去了
在瀏覽器打開class.js查看:找了半天,終於找到:
關鍵代碼:
this.securityEncode(a, "RDpbLfCPsJZ7fiv", "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW") }; //a估計是一個類似於密鑰之類的字符 //b密碼 //c長密鑰,長度爲255 //charCodeAt方法可返回指定位置的字符的 Unicode 編碼 //charAt方法可返回指定位置的字符 //?: JS的三元運算符,就像if...else如:1>3?alert(1):alert(2),條件?情況1:情況2 this.securityEncode = function(a, c, b) { var d = "", e, f, g, h, k = 187, m = 187; f = a.length; g = c.length; h = b.length; e = f > g ? f: g; for (var l = 0; l < e; l++) m = k = 187, l >= f ? m = c.charCodeAt(l) : l >= g ? k = a.charCodeAt(l) : (k = a.charCodeAt(l), m = c.charCodeAt(l)), d += b.charAt((k ^ m) % h); return d };
看懂上面的JS代碼後很容易用Python實現該算法
python實現:
#!/usr/bin/env python2.7 #-*- ending:utf-8 -*- short = "RDpbLfCPsJZ7fiv" #a Lng = 'yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW' #c PawD = '123456@...' #b #ord與JS的charCodeAt方法類似,返回指定位置的字符的 Unicode 編碼 def encrypt_passwd(a, b, c): e = '' f, g, h, k, l = 187, 187, 187, 187, 187 n = 187 g = len(a) h = len(b) k = len(c) if g > h: f = g else: f = h for p in list(range(0, f)): n = l = 187 if p >= g: n = ord(b[p]) else: if p >= h: l = ord(a[p]) else: l = ord(a[p]) n = ord(b[p]) e += c[(l ^ n) % k] print e encrypt_passwd(short, PawD, Lng )
效果: