当前位置:网站首页>JS逆向字体反爬,某供应商平台反爬实践
JS逆向字体反爬,某供应商平台反爬实践
2022-08-04 11:31:00 【InfoQ】
你正在阅读
【梦想橡皮擦】
的博客
阅读完毕,可以点点小手赞一下
发现错误,直接评论区中指正吧
橡皮擦的第 <font color=red>674</font> 篇原创博客
️ 实战场景
本次要采集的站点是某供应商平台,域名如下所示:
aHR0cHM6Ly9jbi5jaGluYS5jbg==
这次要采集的是公开的电话号码,注意是公开的,不是隐私数据哦~

通过开发者工具得到上图所示内容,仅数字部分进行了字体反爬。
字体文件分析
在网页源码寻找字体文件相关内容,得到的结果如下图所示。

而我们下载字体文件,打开发现并不是一个固定的字体文件。

该文件中仅包含了号码中存在的数字,再次打开一页详情,查看其字体文件。

每次刷新之后,得到的字体文件和编码全部不同,本案例难度就提高了一点点。
️ 供应商字体反爬 实战场景
通过
font 模块加载字体文件,分别解析两个文件,对比数字一的矢量图部分内容,发现编码不一致,但是内容是完全相同的。
import re
from fontTools.ttLib import TTFont
from hashlib import md5
font = TTFont('./fonts/112.woff')
font.saveXML('./112.xml')


下面我们复制一段目标站点响应的源码,其表示的电话如下所示:

<span class="secret">𐃎𐃏𐃏 𐃏𐃏𐃎𐃐 𐃐𐃑𐃒𐃒</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 加密之后得到的,便于后续对比。

下面你就要通过测试,获取所有的数字编码。
右下角有个大拇指,点赞的漂亮加倍
边栏推荐
猜你喜欢
随机推荐
HyperLynx仿真(一)LineSim简单介绍
MySQL 45 讲 | 10 MySQL为什么有时候会选错索引?
超美星空特效,你Get了吗?
【LeetCode】653. 两数之和 IV - 输入 BST
mongo-导出数据到mysql
Move the blog to CSDN
cat /proc/kallsyms 发现内核符号表值都为0
『快速入门electron』之实现窗口拖拽
你值得拥有的登录注册页面(附赠源码)
微信公众号之底部菜单
Leetcode brush - structure binary tree (105. Once upon a time sequence and the sequence structure binary tree traversal sequence, 106. From the sequence with the sequence structure binary tree travers
拦截器,文件流,下载文件?
不会还有人不知道防抖吧?
复盘:经典的HR面试问题,这些问题可以挖掘你个人的素质,看看你是否合适合我们部门
将博客搬至CSDN
Oracle中对临时表空间执行shrink操作
【LeetCode】700.二叉搜索树
强烈推荐一款优秀且通用的后台管理系统
什么是 DevOps?看这一篇就够了!
Mysql——》类型转换符binary









