1. 程式人生 > >js混淆解密_谷歌映象的url分析

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。