目标解决零度代理JS解密
网址: https://nyloner.cn/proxy
观察下面的参数有什么不同之处。上图的token和下图的token不一样,上图的t和下图的t也不一样,有过编程经验的小伙伴会明白参数是动态生成的,简单来说被加密了。
再来看看里面的内容
这里我们来分析一下加密的参数,上图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 += “<tr>\n<td>” + (index + 1) + “</td>\n”; setHtml += “<td>” + item.ip.toString() + “</td>\n”; setHtml += “<td>” + item.port.toString() + “</td>\n”; setHtml += “<td>” + item.time.toString() + “</td>\n</tr>\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代码。
想看源码可以在留言区评论,我会把我微信给你。
xwdjj一个,希望与大家交流心得,一起进步。
15743537