網絡爬蟲-icgoo電子元件網js加密破解分析

失蹤人口迴歸~~~
今天是幫一個小老弟看的一個比較簡單的js加密網站,考慮到一部分童鞋對js加密這塊還不太熟悉,我就簡單地把思路和流程捋一捋。
首先打開需要拿數據的頁面 → 電子元件網AD620
在這裏插入圖片描述
在這裏插入圖片描述

嘩啦啦的就加載出來了 ,然鵝右鍵查看源碼, 一看,果然沒有頁面上的數據,確診動態js加載無疑。於是下一步就是萬能的fiddler大法了。

在這裏插入圖片描述

這些就是刷新頁面所有的請求了,但框出來的這一部分是啥? 這個後面會講,咱們先看看第一個請求拿到的頁面,是一個空html,裏面啥數據也沒有,這時候就看看後面的請求,比如框出來的這一部分,仔細一看,裏面都有個token參數,而且長得還都一模一樣,看來這網站的加密並不是那麼的高深(自我安慰)。

在這裏插入圖片描述

接下來就是比較關鍵的地方了,如何模擬生成這個token參數,首先我們得找到這個token是怎麼來的,至於不知道token是啥的童鞋,建議看一看這篇文章 → 簡單理解token機制

然後我們回到上一個頁面,也就是第一個請求拿到的空html,衆所周知,一般這種空html都不會做無用功,都會貼點token啊,公鑰啊,或者重定向之後的頁面等等,所以我們全局搜索一下token吧~

在這裏插入圖片描述

如圖所示。可以輕鬆地看到,這段js就是生成上上上(第幾個上忘了)圖中框選的那些url了,好的,那麼記一下這幾個function,getToken,getdata,因爲在這個空html頁面上沒有這倆方法。所以接下來我們需要用到chrome的全局搜索,當然也可以打斷點調試,這個比較簡單,直接全局搜索即可。

在這裏插入圖片描述

不會用的童鞋我就多BB兩句…按F12, 再點擊sources,再按ctrl+shift+F全局搜索,輸入你剛剛想找的那個方法,如getToken,那麼我們找到了,雙擊點進去,再點擊那個大括號,這是谷歌幫我們格式化好之後的js代碼。

這時候需要有點基本功了,不過這個js算簡單的,很容易就能讀懂,就是直接傳參數進去,返回給你的就是加密後的token了,我們用python的pyexecjs庫可以很輕鬆地實現。

這是getToken的js

var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "=";
function getToken(chr0, q) {
    var output = "";
    var chr1, chr2, chr3, chr4 = "";
    var enc1, enc2, enc3, enc4 = "";
    var ecc5 = q.substr(8, 3);
    var i = 0;
    q = q.substring(0, 8) + q.substr(11);
    chr1 = q;
    chr2 = chr0;
    chr3 = chr2 / 100 << 2 + "sdfde";
    chr0 = "wcqsdfg" + (chr1 + "pqskfg");
    chr0 = "pqs?kfg" + chr0.substring(0, 11) + chr1.substring(18, chr1.length) + chr0.substring(0, 8) + chr1.substring(0, 18) + "wcq@sdfg";
    chr4 = "=hmo28jc37qk" + lq(chr2);
    do {
        chr1 = chr2.charCodeAt(i++);
        chr3 = chr2.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        if (isNaN(chr2)) {
            enc3 = enc4 = 64
        } else {
            if (isNaN(chr3)) {
                enc4 = 64
            }
        }
        output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        output = keyStr.charAt(enc2) + keyStr.charAt(enc1) + keyStr.charAt(chr0) + chr0 + keyStr.charAt(enc2) + chr4;
        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = ""
    } while (i < chr3.length);output = output.substr(0, 8) + ecc5 + output.substr(8);
    return output
}

function lq(str) {
    var chr1, chr2, chr3, chr4 = "";
    var enc1, enc2, enc3, enc4 = "";
    chr1 = "p1";
    chr2 = "c0";
    chr3 = "hj";
    chr4 = "wh";
    enc1 = str.substring(0, 2);
    enc1 = enc1 + chr1;
    enc2 = str.substring(3, 2);
    enc2 = chr3 + chr2;
    enc3 = str.substring(5, 2);
    enc3 = enc1 + enc2 + enc3 + chr4;
    return enc3
}

這是python運行js的部分代碼

r = s.get("https://www.icgoo.net/search/?partno=AD620&qty=1&tdsourcetag=s_pcqq_aiomsg", headers=headers, proxies=proxies)
# print(r.text)
try:
    token_ = re.findall("getToken\(sups\[i\], '(.*?)'\)", r.text)[0]
except Exception as e:
    print(e)
    print('無法捕捉token')

supps = 'mouser,digikey,rochester,element14,hot,chip1stop,oem,future,element14_sh,online,arrow,verical,heilind,rs_china,rs_hk,avnet,questcomp,other,peigenesis,rutronik,tme,allied,corestaff,overstock,peigenesis_cn,excess,arrow_special,distrelec,rs_pro,microchip,icgoo_must_buy_parts,buerklin,epc,runic'
supp_list = supps.split(',')
token_list = []

for i in range(len(supp_list)):
    _JS = execjs.compile(open("token.js", "r").read())  # 初始化JS
    token = _JS.call("getToken", supp_list[i], token_)
    token_list.append(token)
print(token_list)

在這裏需要注意幾個地方:

①可以看到這個方法需要兩個參數,chr0和q,那這兩個參數哪裏來的,需要自己去思考,當然了我們不用思考,因爲這個比較簡單,就直接貼在了第一個請求的html上面。

②爲什麼我沒有去找getdata這個方法,因爲通過對比這幾個請求我發現其實變化的也就只有token這個參數以及sup,而sup他也是貼在了html上的,supps,直接複製粘貼到編譯器裏面即可。

③這個網站對ip有限制,訪問速率過快會彈驗證碼,這個需要注意,不然拿我的代碼運行幾次發現就報錯還不知道爲什麼。所以需要準備一定量的IP,對cookie的話我沒發現有什麼驗證,加不加都無所謂。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

分析完畢。可以發現我們已經拿到了其中的數據,我也只是做了簡單的一個分析,沒有很細地去詳細看,demo代碼已經上傳到了我的github上,有需要的童鞋可以看看。

github傳送門 → 。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章