继续破解
这段是用脚本抓到的html页面里显示IP的部分:
<ul class="l2">
<span><li>180.97.81.215</li></span>
<span style="width: 100px;"><li class="port CFACE">8635</li></span>
...
</ul>
这里是上次破解得到的js代码:
$(function() {
$('.port')['each'](function() {
var a = $(this)['html']();
if (a['indexOf']('*') != -0x1) {
return
};
var b = $(this)["attr"]("class");
try {
b = (b["split"](" "))[0x1];
var c = b["split"]("");
var d = c["length"];
var f = [];
for (var g = 0x0; g < d; g++) {
f["push"]("ABCDEFGHIZ"["indexOf"](c[g]))
};
$(this)["html"](window["parseInt"](f["join"]("")) >> 0x3)
} catch(e) {}
})
})
解读代码
咱们把两个对照着一起看。
- 首先把所有
class
中包含port
的html块挑出来,对它们做循环。 - 对每个块先看tag的内容,如果里面包含
*
,那么就跳过不处理。 - 取出所有的
class
,用split
分解后,再取第2个(0x1),结果我们上面的html,这里b
的值应该是CFACE
。 - 将
CFACE
拆成字符数组(c),对数组进行循环。 - 找到每个字符在
ABCDEFGHIZ
里的索引,组成一个新的字符数组(f)。 - 将数组组合成一个字符串后转成一个整数,再按位右移3位,用它修改原来的tag内容,这里就是修改的
8635
。
这里我把算法单独用python写出来:
def decrypt(src):
s = 'ABCDEFGHIZ'
dst = ''
for c in src:
dst += str(s.find(c))
dst = int(dst) >> 3
return dst
至此,端口就被破解出来了。
结语
可以看出来直接抓data5u的页面,里面显示的端口号是随机给的一个错误值,真正的值其实是保存在class
属性里再通过一个js函数反解出来的。
不过毕竟是js代码,这种加密只能算是混淆而已,对于一些高手来说还是很好破解的。
最后放上一段我写的抓取代理ip的脚本,希望能对大家有所帮助:
import requests
from bs4 import BeautifulSoup
URL = "http://www.data5u.com/"
def extract_proxy_ip():
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}
r = requests.get(URL, headers=headers)
if r.status_code != 200:
print 'get url error:', r.status_code
print r.cookies
html = r.text
soup = BeautifulSoup(html)
for tag in soup.find_all("ul", "l2"):
g_ip_list[tag.li.string] = [tag.li.string,decrypt(tag.find_all("li", "port")[0]['class'][1])]
return ip_list
def decrypt(src):
s = 'ABCDEFGHIZ'
dst = ''
for c in src:
dst += str(s.find(c))
dst = int(dst) >> 3
return dst
print extract_proxy_ip()