2.data5u的代理IP的端口加密破解(2)

继续破解

这段是用脚本抓到的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) {}
    })
})

解读代码

咱们把两个对照着一起看。

  1. 首先把所有class中包含port的html块挑出来,对它们做循环。
  2. 对每个块先看tag的内容,如果里面包含*,那么就跳过不处理。
  3. 取出所有的class,用split分解后,再取第2个(0x1),结果我们上面的html,这里b的值应该是CFACE
  4. CFACE拆成字符数组(c),对数组进行循环。
  5. 找到每个字符在ABCDEFGHIZ里的索引,组成一个新的字符数组(f)。
  6. 将数组组合成一个字符串后转成一个整数,再按位右移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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    前端进阶之旅阅读 114,931评论 24 450
  • 月影传说100阅读 154评论 1 1
  • 单词锚定\<:其后面的字符必须作为单词的首部出现,也可\b例如:grep '\<root' test3.txt在t...
    随玉而安_gao阅读 204评论 0 0