JS逆向字体反爬,某供应商平台反爬实践

1,051 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

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

⛳️ 实战场景

本次要采集的站点是某供应商平台,域名如下所示:

aHR0cHM6Ly9jbi5jaGluYS5jbg==

这次要采集的是公开的电话号码,注意是公开的,不是隐私数据哦~ JS逆向字体反爬,某供应商平台反爬实践 通过开发者工具得到上图所示内容,仅数字部分进行了字体反爬。

字体文件分析 在网页源码寻找字体文件相关内容,得到的结果如下图所示。 JS逆向字体反爬,某供应商平台反爬实践 而我们下载字体文件,打开发现并不是一个固定的字体文件。 JS逆向字体反爬,某供应商平台反爬实践 该文件中仅包含了号码中存在的数字,再次打开一页详情,查看其字体文件。

JS逆向字体反爬,某供应商平台反爬实践 每次刷新之后,得到的字体文件和编码全部不同,本案例难度就提高了一点点。

⛳️ 供应商字体反爬 实战场景

通过 font 模块加载字体文件,分别解析两个文件,对比数字一的矢量图部分内容,发现编码不一致,但是内容是完全相同的。

import re
from fontTools.ttLib import TTFont
from hashlib import md5

font = TTFont('./fonts/112.woff')
font.saveXML('./112.xml')

JS逆向字体反爬,某供应商平台反爬实践 JS逆向字体反爬,某供应商平台反爬实践 下面我们复制一段目标站点响应的源码,其表示的电话如下所示: JS逆向字体反爬,某供应商平台反爬实践

<span class="secret">&#x100ce;&#x100cf;&#x100cf; &#x100cf;&#x100cf;&#x100ce;&#x100d0; &#x100d0;&#x100d1;&#x100d2;&#x100d2;</span>

我们在字体文件中读取一下上图所示内容。

import re
from fontTools.ttLib import TTFont
from hashlib import md5

# font = TTFont('./fonts/112.woff')
# font.saveXML('./112.xml')
# 读取字体文件
font = TTFont('./fonts/112.woff')
# 读取 cmap
cmap = font.getBestCmap()
with open('./112.xml','r',encoding='utf8') as f:
    ret = f.read()
ret = ret.replace('\n','').replace(' ','')
# print(ret)

for i in cmap:
    # 查询目标数据
    data = re.findall(f'<CharStringname="{cmap[i]}">(.*?)</CharString>', ret)[0]
    # print(data)
    # 将查询到的结果进行 md5 编码
    char_md5 = md5(data.encode('utf8')).hexdigest()
    print(char_md5)

得到结果如下所示,下图所有值都经过 md5 加密之后得到的,便于后续对比。

JS逆向字体反爬,某供应商平台反爬实践 下面你就要通过测试,获取所有的数字编码。

📣📣📣📣📣📣 右下角有个大拇指,点赞的漂亮加倍