js混淆解密_谷歌映象的url分析
參考(萬分感謝):http://blog.icxun.cn/Python/438.html
剛開始學習爬蟲,遇到了一個js加密的網站,技術不夠,很無奈,開始了學習js加密解密的路,一個簡單的加密網站作為demo。
開始:
目標網址:http://ac.scmor.com/
想爬取紅框內部的url,首先進行分析
F12開發者模式,發現a標籤的onclick觸發了一個visit()函式,而且裡面的引數不可讀,不在是一個url地址,斷定網頁已經進行過加密。
開始分析,a標籤呼叫了函式,而函式在js檔案中呼叫,所有在所有的js檔案中搜索visit關鍵字。
已經找到了visit存在的js檔案,雙擊後,右邊response中顯示具體函式
分析visit函式得知,函式中使用了Gword變數進行判斷是否為空,不為空的時候執行如下程式碼,執行後繼續執行使用lication實現網頁跳轉
url = strdecode(url)
我們繼續搜尋Gword變數,開始分析一共又三處,都在和儲存visit函式相同js檔案內,目前開來Gword是不在js檔案中定義的。
那麼,我們嘗試的去網頁中進行尋找,網頁->右鍵->檢視網頁原始碼進行搜尋
存在!!,Gword的值是" [email protected]",因為js檔案中只有對Gword進行判斷和拼接,沒有重新賦值,所以說Gword這個變數是一直不為空的,所以js檔案的visit函式是會執行如下,返回的結果進行跳轉
url = strdecode(url);
以下為strdecode方法和其相關的方法(都在當前的js檔案中)
//code function strdecode(string) { string = base64decode(string); key = Gword+'ok '; len = key.length; code = ''; for (i = 0; i < string.length; i++) { var k = i % len; code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k)) } return base64decode(code) } var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); function base64decode(str) { var c1, c2, c3, c4; var i, len, out; len = str.length; i = 0; out = ""; while (i < len) { do { c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff] } while (i < len && c1 == -1); if (c1 == -1) break; do { c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff] } while (i < len && c2 == -1); if (c2 == -1) break; out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); do { c3 = str.charCodeAt(i++) & 0xff; if (c3 == 61) return out; c3 = base64DecodeChars[c3] } while (i < len && c3 == -1); if (c3 == -1) break; out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); do { c4 = str.charCodeAt(i++) & 0xff; if (c4 == 61) return out; c4 = base64DecodeChars[c4] } while (i < len && c4 == -1); if (c4 == -1) break; out += String.fromCharCode(((c3 & 0x03) << 6) | c4) } return out }
看樣子已經知道了該網頁如何進行js加密的,所以在本地新建一個html檔案,模擬進行加密,將js檔案中visit函式中的字串作為引數傳入,檢視最後的返回結果,進行驗證
如下是我的html檔案程式碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js加密驗證</title>
</head>
<body>
<script>
var Gword = " [email protected]"
function strdecode(string) {
string = base64decode(string);
key = Gword+'ok ';
len = key.length;
code = '';
for (i = 0; i < string.length; i++) {
var k = i % len;
code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k))
}
return base64decode(code)
}
var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
function base64decode(str) {
var c1, c2, c3, c4;
var i, len, out;
len = str.length;
i = 0;
out = "";
while (i < len) {
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
} while (i < len && c1 == -1);
if (c1 == -1) break;
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
} while (i < len && c2 == -1);
if (c2 == -1) break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
do {
c3 = str.charCodeAt(i++) & 0xff;
if (c3 == 61) return out;
c3 = base64DecodeChars[c3]
} while (i < len && c3 == -1);
if (c3 == -1) break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
do {
c4 = str.charCodeAt(i++) & 0xff;
if (c4 == 61) return out;
c4 = base64DecodeChars[c4]
} while (i < len && c4 == -1);
if (c4 == -1) break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4)
}
return out
}
console.log(strdecode('QSQ7XggEHBUhXUdGBwZYAAp4ZhQlAyU2ETBYBRBHWl8JXABW'))
</script>
</body>
</html>
執行 F12 console中檢視結果:
單擊開啟網址,和我在原網頁中單擊開啟的網址一樣。故解密完畢
網址已經拿到,所以只需將js加密函式轉換成python格式,然後從網頁中取出visit函式傳入的實參傳入即可獲取真正的url。