python爬虫 - js逆向解密之简单端口加密破解 -- 修复版
前言
这次这个网站很巧,也是一个代理网站,不过这次不是我那老朋友给的了,是我自己偶然找到的,而且也是端口加密的,跟之前某篇文章差不多。
想源网址的,为了避免一些不必要的麻烦,私我给地址吧(直接在博客园私信,不用去其他地方,免得误会我是为了推广拉新啥的)
这个网站虽然是国外的(需要挂dl访问),安全等级虽然也很低,对js逆向感兴趣的可以拿来练练手,但拿到到网址的朋友也请不要毫不留情的去一直请求别人网站。
开始分析
打开网站
发现端口加密了(其实这里严格意义上都不叫加密),查看源码确认:
确实如此
现在怎么办呢,不用说,端口肯定是这几个参数,控制台里看能直接访问不:
能直接访问,而且结果能对上,说明这几个参数是全局定义的变量,到处都可以调用,说到这,你知道我上面为什么要说都不算加密了吧,这都没涉及到js逆向的,直接就拿到了
接下来就找这几个变量是在哪定义的了,既然是全局定义的,那么先找源码里的script标签的js代码,看有没有,没有再去引入的js文件里找,不过,说实话,它这个都是小写的字母,直接搜索确实不好搜,因为匹配到的太多了。
先找源码里的script吧,从头开始找
找到关键点
从头一找就找到了,这运气就是好:
而且这几个参数的值我对应了下,确实能跟源码展示的端口对上
接下来就是用python改写这段代码了
用python实现
在实现之前,先用xpath把值拿到
说下这里我为什么要拼接成字符串,因为这样,才能更源码里对上,因为源码是用的字符串拼接,而不是数字加减:
那么这段代码怎么执行呢,用exec,如下,我其实并没有定义l,用exec后就可以直接调用
然后再把ip拿到,然后拼接起来就可以了,注意拼接端口时用的eval,而不是exec
用这个结果跟源码对比:
发现能对上,ok了
完整代码
import requests
from lxml import etree
from lxml.html import tostring
from bs4 import BeautifulSoup, Comment
HEADERS = {
'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'cross-site',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'Connection': 'close',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}
url = '' # 保密
req = requests.get(url, headers=HEADERS)
res = req.content.decode('utf-8')
html = etree.HTML(res)
key = html.xpath('//script[contains(@src,"js1")]/following-sibling::script[1]/text()')
key = ''.join(key) if key else ''
key = key.strip().replace(' ', '').replace('=', '=str(').replace(';', ');')
print(23123, key)
end = []
if key:
exec(key)
data = html.xpath('//table[@id="proxylist"]/tr')
for item in data:
ip = item.xpath('./td[2]/text()')
ip = ''.join(ip) if ip else ''
port_temp = item.xpath('./td[2]/script/text()')
port_temp = ''.join(port_temp) if port_temp else ''
port_temp = port_temp.replace('document.write(":"+', '').replace(')', '')
port = eval(port_temp)
if ip and port:
proxy = ip + ":" + port
end.append(proxy)
print(12312, len(end), end)
结语
是不是不算加密嘛?我反正是觉得真的不叫加密,只是看起来就点不好操作,但是你只要稍微的懂点javascript代码都可以搞定的。
另外,请注意exec和eval的用法,这个是属于python的基础了,这个在我的从零学python的系列篇的文章里有的