JS逆向入门学习之回收商网,手机号码简易加密解析&熟人必看,Python爬取某黄页公开信息,字体反爬实战

举报
梦想橡皮擦 发表于 2022/08/04 11:26:44 2022/08/04
【摘要】 ⛳️ 实战场景本次要采集的目标站点是 huishoushang.com/,其数据详情页有公开的联系电话,页面采用前台 JS 加密,测试时原以为是字体反爬,结果不是。随机打开二手市场的某条数据,我们又看到了熟悉的手机号码,然后快速的切换到了开发者工具的字体选项卡,结果什么都没有抓取到。心理高兴,以为碰到了新的字体加密形式,结果打脸了。呈现效果如下所示,可以看到网页源码并没有返回任何数字相关信...

⛳️ 实战场景

本次要采集的目标站点是 huishoushang.com/,其数据详情页有公开的联系电话,页面采用前台 JS 加密,测试时原以为是字体反爬,结果不是。

随机打开二手市场的某条数据,我们又看到了熟悉的手机号码,然后快速的切换到了开发者工具的字体选项卡,结果什么都没有抓取到。

心理高兴,以为碰到了新的字体加密形式,结果打脸了。

呈现效果如下所示,可以看到网页源码并没有返回任何数字相关信息,但是有一个 decrypt 映入眼帘,这么明显的加密提示吗?

⛳️ 实战编码

由于加密信息在 HTML 元素的属性中,所以直接检索关键字 decrypt 即可。

首先将加密字符串提取一个,用作测试

(((((((((a01 % a03) % g02) % g08) % a08) % g04) % a09) % c07) % c00) % b09) %
  b08;

搜索之后得到如下解密代码:

var str = $(th).attr("decrypt");
if (str != null || str != undefined || str != '') {
     $(th).attr("decryptok", "");
     // str = str.replace(/-/g, ",").replace(/ /g, ",");
     let strArray = str.split('%');
     var newArray = [];
     for (var i = 0; i < strArray.length; i++) {
         let _rTemp = this.model.rArray.filter((a) => a.l == strArray[i]);
         if (_rTemp.length > 0) {
             newArray.push(_rTemp[0].v);
         } else {
             newArray.push(strArray[i]);
         }
     }
     $(th).html(newArray.join(''));

其中发现了一个关键点,即通过 str.split('%'),截取了字符串,而且 this.model.rArray 也成为了问题的突破点。

在源码中再次检索 rArray,又找到了其定义的位置。

/*数字解密 */
var NumberDecrypt = {
    model: {
        rArray: [
            { l: 'a01', v: '1' }, { l: 'b02', v: '1' }, { l: 'c03', v: '1' }, { l: 'f04', v: '1' }, { l: 'g01', v: '1' },
            { l: 'a02', v: '2' }, { l: 'b03', v: '2' }, { l: 'c04', v: '2' }, { l: 'f05', v: '2' }, { l: 'g00', v: '2' },……
        ],
        refreshTime: null,
        refreshCount: 0
    },

此时相信你已经知道了解决方案,即加密字符串通过 % 切割,然后将得到的值,例如 a01 在转换为数字 1

这次的案例没有想到这么简单,希望大家可以轻松掌握。

⛳️ 黄xx页 字体反爬 实战场景

本次采集的目标站点为 aHVhbmd5ZTg4.com ,首页截图如下所示。

在官网找到【黄x页】选项卡,然后得到如下界面,其中涉及的信息如下,随机找到一个公开数据。

在公司黄页详情页可以查看到联系人和联系号码。

这里明显看到手机字体与其它字体有所差异,通过开发者工具进行验证之后,确定存在字体反爬。

保存字体文件,得到下述字体矢量图。

结果字体的编码是固定的英文,那这字体反爬的难度就变的极低了。

⛳️ 实战编码

通过开发者工具可以找到字体文件在网页源码中,所以我们编写一下相关提取代码。

import re

import requests
import base64
from fontTools.ttLib import TTFont

url = 'https://b2b.huangye88.com/qiye1edkfp0964c7/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36'
}

res_text = requests.get(url=url, headers=headers).text
ba64 = re.findall('base64,(.*?)\"\)', res_text)[0]
# print(ba64)

data = base64.b64decode(ba64)
with open('./fonts/519.woff', 'wb') as f:
    f.write(data)
font = TTFont('./fonts/519.woff')
font.saveXML('./fonts/519.xml')

得到字体之后,保存的 XML 文档如下所示。

本案例已经结束。

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 680 篇原创博客

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。