最新爬取全网代理IP【隐藏标签混淆+端口加密】(二)

爬取全网代理IP【隐藏标签混淆+端口加密】(二)

最新爬取全网代理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加密 的练习,还是不错的。哈哈哈哈👏。

刚接触这块知识,代码写的不好,还请谅解,如果有理解错误的,也请大佬在评论区指出来,非常感谢!

以上就是端口解密的所有内容了,点赞收藏加评论是最大的支持哦!

以上就是端口解密的所有内容了,点赞收藏加评论是最大的支持哦!

📑编写不易,转载请注明出处,如有侵权,请联系我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeBoy‍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值