python爬虫简单实现逆向JS解密

目标解决零度代理JS解密

网址: https://nyloner.cn/proxypython爬虫简单实现逆向JS解密_第1张图片

python爬虫简单实现逆向JS解密_第2张图片
观察下面的参数有什么不同之处。上图的token和下图的token不一样,上图的t和下图的t也不一样,有过编程经验的小伙伴会明白参数是动态生成的,简单来说被加密了。

再来看看里面的内容
python爬虫简单实现逆向JS解密_第3张图片

这里我们来分析一下加密的参数,上图t这个参数是一串数字,我们来猜一下啊,这串数字是什么呢?。一个简单的时间戳。token肯定是被加密方式加密的具体哪种加密方式,等下看JS代码。
JS代码怎么找,自己去研究一下吧,很简单的,这里就不介绍了,直接上代码。
下面是其中部分的JS代码,只找有用的部分就可以了
发现用的是md5加密,很简单。下面用Python实现一下,几行代码的事。

function get_proxy_ip(page, num, click_btn) {
    var timestamp = Date.parse(new Date());
    timestamp = timestamp / 1000;
    var token = md5(String(page) + String(num) + String(timestamp));
    $.get('../proxy?page=' + page + '&num=' + num + '&token=' + token + '&t=' + timestamp, function (result) {
        if (result.status === 'true') {
            var setHtml = "";
            $("#ip-list").html(setHtml);
            var encode_str = result.list;
            var items = str_to_json(decode_str(encode_str));
            for (var index = 0; index < items.length; ++index) {
                item = items[index];
                setHtml += "\n" + (index + 1) + "\n";
                setHtml += "" + item.ip.toString() + "\n";
                setHtml += "" + item.port.toString() + "\n";
                setHtml += "" + item.time.toString() + "\n\n";
            }
            $("#ip-list").html(setHtml);
            if (click_btn === 'next') {
                document.getElementById("last-page").disabled = false;
                if (items.length < 15) {
                    document.getElementById("next-page").disabled = true;
                }
            } else {
                document.getElementById("next-page").disabled = false;
                if (page === 1) {
                    document.getElementById("last-page").disabled = true;
                }
            }

        }
    });
}

python代码
模仿JS代码,模仿JS代码,模仿JS代码

def get_token(self,page,num):

    #获取时间戳
    timestamp = int(time.time())

    token = str(page) + str(num) + str(timestamp)
    
    #模仿token加密
    token = hashlib.md5(token.encode()).hexdigest()
    
	#我这里是把参数返回到url地址上,每个人写代码方式不同,这里可以忽略,明白上面就可以了
    basurl = self.url.format(page, num, token, timestamp)

    return basurl

参数加密解决了,最后解决内容加密
上JS代码

function decode_str(scHZjLUh1) {
    scHZjLUh1 = Base64["\x64\x65\x63\x6f\x64\x65"](scHZjLUh1);
    key = '\x6e\x79\x6c\x6f\x6e\x65\x72';
    len = key["\x6c\x65\x6e\x67\x74\x68"];
    code = '';
    for (i = 0; i < scHZjLUh1["\x6c\x65\x6e\x67\x74\x68"]; i++) {
        var coeFYlqUm2 = i % len;
        code += window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](scHZjLUh1["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](i) ^ key["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](coeFYlqUm2))
    }
    return Base64["\x64\x65\x63\x6f\x64\x65"](code)
}

不要慌,简单的base64和16进制
上python

16进制可以借助工具啊
http://www.bejson.com/convert/ox2str/

def decode_str(self,scHZjLUh1):
    """
    解密base64
    \x64\x65\x63\x6f\x64\x65 : decode
    \x6e\x79\x6c\x6f\x6e\x65\x72 : nyloner
    \x6c\x65\x6e\x67\x74\x68 : length
    \x53\x74\x72\x69\x6e\x67 : String
    \x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65 : fromCharCode
    \x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74 : charCodeAt

    :param scHZjLUh1:
    :return:
    """
    scHZjLUh1 = base64.decodestring(scHZjLUh1.encode())
    key = 'nyloner'
    lenth = len(key)
    code = ''
    sch_lenth = len(scHZjLUh1)

    for i in range(sch_lenth):
        coeFYlqUm2 = i % lenth
        code += chr(scHZjLUh1[i] ^ ord(key[coeFYlqUm2]))

    code = base64.decodestring(code.encode())

    code = code.decode('utf-8')


    return code

最后就是调用一下解析文本就OK了,解密方式就是模仿JS代码,对比一下JS和Python代码。
想看源码可以在留言区评论,我会把我微信给你。
小白一个,希望与大家交流心得,一起进步。

你可能感兴趣的:(爬虫解密,逆向JS)