首页 » 技术分享 » 网络爬虫-icgoo电子元件网js加密破解分析

网络爬虫-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传送门 → icgoo电子元件网js加密破解分析

转载自原文链接, 如需删除请联系管理员。

原文链接:网络爬虫-icgoo电子元件网js加密破解分析,转载请注明来源!

0