爬取全网代理IP【隐藏标签混淆+端口加密】(二)
上一篇文章,我们剔除掉了混淆在其中的隐藏标签,这篇我们讲讲如何对端口进行解密。
前言:其实我一开始剔除掉混淆在其中的隐藏标签的时候,以为就结束了(心想:也不过如此嘛),直到我把这些爬取下来的ip拿去验证时,没一个有效,才慢慢发觉其端口有猫腻,居然进行了加密。
二、端口解密
1.再次造访
由于上一回的大意,这回得好好分析下它的网页结构了。
直接点,将其响应内容给下载下来(或者在浏览器中查看url对应的响应内容),好生伺候下,发现展示在网页上的端口跟我们响应内容中的端口不一样。草率了!!!
2.寻找突破口
那我们就先要了解清楚,它为什么展示在前端的会跟响应内容不一样,js搞得鬼???
带着疑惑,我们就来验证下
我们可以看到,在响应内容中,一共涉及到了5个js响应,最简单粗暴的方法就是,挨个注释掉并查看此网页,是否还能显示正确的端口号。验证发现,第一个跟最后一个注释掉,会显示响应内容中的端口号,即伪值。第一个jquery.js
可以直接排除,怎么可能会将加密逻辑写入到jquery.js
。所以现在所有目光都投向.../pde.js?v=1.0
。让我们来看看其 js链接 里面的内容
http://www.goubanjia.com/theme/goubanjia/javascript/pde.js?v=1.0
我就不展开来了,占位置😂。总之,看官点进去看源代码之后,都是一个字,懵,不用怕,我也懵,这谁看得懂,但我们冷静下来之后,再看下,应该是进行了某种加密,并且发现开头有 一个eval
,有幸的是在前几天,在一篇关于写JS加密与解密的文章中,看到过这个加密,于是就直接搜eval方法在线解密
,结果真有。(我们先抛开eval方法如何加密与解密问题,这个问题可以后续自行深入了解)
3.研究兵法
在网上随便找一个解密的,如eval方法在线解密,将我们刚才那个js链接里面的内容,复制进去,点击JS解密。
这里带大家了解下,该源码是进行了双层eval方法加密,并且里面的字符进行了十六进制的编码。
所以还需要进行一次解码。刚才点击JS解密之后,它自动探测到了有编码,点击确定,进行解码
此时,呈现在我们面前的代码如下:
var _$ = ['.port', "each", "html", "indexOf", '*', "attr", 'class', "split", " ", "", "length", "push", 'ABCDEFGHIZ', "parseInt", "join", ''];
$(function() {
$(_$[0])[_$[1]](function() {
var a = $(this)[_$[2]]();
if (a[_$[3]](_$[4]) != -0x1) {
return
};
var b = $(this)[_$[5]](_$[6]);
try {
b = (b[_$[7]](_$[8]))[0x1];
var c = b[_$[7]](_$[9]);
var d = c[_$[10]];
var f = [];
for (var g = 0x0; g < d; g++) {
f[_$[11]](_$[12][_$[3]](c[g]))
};
$(this)[_$[2]](window[_$[13]](f[_$[14]](_$[15])) >> 0x3)
} catch (e) {}
})
})
js学得不好或者不懂的不要怕,实在不行,我们靠单词意思靠猜嘛!
以上内容可读性可能还不是很强,我们再次转换下,我们看到那些_$[x]
,类似于根据下角标x
去列表中取值,我们将var _$
列表中的所有值,对应填充下去,大致翻译之后,得到以下代码:
$(function() {
$('.port')["each"](function() { // 拿到所有的端口
var a = $(this)["html"](); // 这里不理解也没关系,因为没什么用
if (a["indexOf"]('*') != -0x1) { // -0x1:-1
return
};
// 解密关键
var b = $(this)["attr"]('class'); // b 获取当前端口的class属性 例:"port GEA"
try {
b = (b["split"](" "))[0x1]; // 按空格进行分割,取第二个,并重新赋值给b 其中0x1:1 例:"GEA"
var c = b["split"](""); // c 将每个字符进行切割,得到一个类似于python['G','E','A']
var d = c["length"]; // d 获取c的长度
var f = []; // f 建一个列表
for (var g = 0x0; g < d; g++) { // g=0, g<获取的字符串长度,g++ 其中0x0:0
// c[g],遍历c中的每一个值 类似于python中lict.index(a),其中indexOf是查找字符出现的位置
// 意思就是,将遍历值拿到'ABCDEFGHIZ'字符串中,找到对应出现的位置,返回的值,添加到f列表中
f["push"]('ABCDEFGHIZ'["indexOf"](c[g]))
};
// 最终f列表 获取的是c字符串中,每个字符对应的下角标 列表
// 将f列表中的每一个值字符,合并成一个字符,例如[6, 4, 0],合并之后,成640,
// >>x 除以2的x次方 其中0x3:3 也就是除以2的3次方,即除以8,最后值返回给当前元素
$(this)["html"](window["parseInt"](f["join"]('')) >> 0x3)
} catch (e) {}
})
})
4.破阵
哦~原来如此,解密逻辑终于水落石出了。
想要获取真实的端口号,只要先获取其端口号的属性,进行切割处理,得到后段的字符串,并按照给出的规则'ABCDEFGHIZ'
,去获取每个字符对应规则所在的下角标,最后合成一个数进行除以8,得到的值即是真实端口。
**端口解密
**代码如下:
# TODO 2.解析port值
tr_port = tr.xpath('./td[1]/span[last()]/@class')[0].split(' ')[-1] # 获取端口属性的后一个值
rule_str = 'ABCDEFGHIZ' # 解密规则
real_port = [str(rule_str.index(i)) for i in tr_port]
port = int("".join(real_port)) // 8
print(port)
5.收缴战利品
【完整代码点击下载】
可以作为一次爬虫训练,一个关于
混淆隐藏元素标签
+端口js加密
的练习,还是不错的。哈哈哈哈👏。
刚接触这块知识,代码写的不好,还请谅解,如果有理解错误的,也请大佬在评论区指出来,非常感谢!
以上就是端口解密的所有内容了,点赞收藏加评论是最大的支持哦!
以上就是端口解密的所有内容了,点赞收藏加评论是最大的支持哦!
📑编写不易,转载请注明出处,如有侵权,请联系我!