*车之家动态字体加密破解

*车之家动态字体加密破解

地址:aHR0cHM6Ly9rLmF1dG9ob21lLmNvbS5jbi9kZXRhaWwvdmlld18wMWY5OHY2cWp5NmN2azBkOXM2MHdnMDAwMC5odG1sCiA=

.打开网页可以看到字体是乱码形式
在这里插入图片描述
.打开网页源码可以看到也是乱码
在这里插入图片描述
.通过分析找到字体文件
在这里插入图片描述
.在没有对字体进行解密的时候得到的返回体, 可以看到返回的是乱码
在这里插入图片描述
.并且通过分析每个网站对应的字体也是通过不同链接返回的,这时可以利用fontTools库进行处理, 可以发现uniED7D后四位字符就是网页返回的后四位一样

代码如下(示例):

from fontTools.ttLib import TTFont
import io
file_woff = './wKgHGFsV9-KAbse_AADV6P5R2zE02.ttf'
with open(file_woff, 'rb') as font_file:
    font = TTFont(io.BytesIO(font_file.read()))  # 转换成字体对象
font_obj = font['cmap']
font_tables = font['cmap'].tables
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()
print(uni_list)
# 打印结果['.notdef', 'uniED2B', 'uniED7D', 'uniECCA', 'uniEE0A', 'uniEC68', 'uniEDA9', 'uniEDFA', 'uniED47', 'uniEC94', 'uniECE5', 'uniEC32', 'uniED73', 'uniEDC4', 'uniED11', 'uniED63', 'uniECAF', 'uniEDF0', 'uniEC4E', 'uniED8E', 'uniECDB', 'uniED2D', 'uniEC79', 'uniECCB', 'uniEC18', 'uniED58', 'uniEDAA', 'uniECF7', 'uniEC43', 'uniEC95', 'uniEDD6', 'uniEC34', 'uniED74', 'uniECC1', 'uniED13', 'uniEC5F', 'uniEDA0', 'uniEDF2', 'uniED3E', 'uniED90', 'uniECDD', 'uniEC29', 'uniEC7B', 'uniEDBC', 'uniED08', 'uniED5A', 'uniECA7', 'uniECF8', 'uniEC45', 'uniED86', 'uniEDD7', 'uniED24', 'uniEC71', 'uniECC2', 'uniEE03', 'uniEC61', 'uniEDA1', 'uniECEE', 'uniED40', 'uniEC8C', 'uniEDCD', 'uniEC2B', 'uniED6B', 'uniEDBD', 'uniED0A', 'uniEC56', 'uniECA8', 'uniEDE9', 'uniED35', 'uniED87', 'uniECD4', 'uniED26', 'uniEC72', 'uniEDB3', 'uniEE05', 'uniED51', 'uniEC9E', 'uniECF0', 'uniEC3C', 'uniEC8E', 'uniEDCF', 'uniED1B', 'uniED6D', 'uniECBA', 'uniEC58', 'uniED99', 'uniEDEB', 'uniED37', 'uniEC84', 'uniECD6', 'uniEC22']

在这里插入图片描述
.既然每个网页都是不同的字体文件,所以做不了固定关系映射,并且考虑到刷新页面时字体序号序号会不会变化,所以后续的思路为请求网站并且拿到字体文件链接保存在本地,利用PIL库将每个字体生成为单个图片,利用ddddocr识别获取字体。

def img_save():
	# 将字体文件每个字体保存为单个图片,并将名称设置为每个字体的序号
    font = TTFont('wKgHGFsV9-KAbse_AADV6P5R2zE02.ttf')
    # 图片宽度和高度
    img_size = 512
    font_img = ImageFont.truetype("wKgHGFsV9-KAbse_AADV6P5R2zE02.ttf", 300)
    for cmap_code, glyph_name in font.getBestCmap().items():
        # 实例化一个图片对象
        img = Image.new('1', (img_size, img_size), 255)
        # 绘制图片
        draw = ImageDraw.Draw(img)
        # 将编码读取成字节
        txt = chr(cmap_code)
        x, y = draw.textsize(txt, font=font_img)
        draw.text(((img_size - x) // 2, (img_size - y) // 2), txt, font=font_img, fill=0)
        # img.show()
        img.save("./imgs/" + glyph_name + ".png")

def img_ocr():
	# 将生成的图片遍历并且识别,保存为字典里
    item = dict()
    png_list = os.listdir('./imgs/')
    for p in png_list:
        path = f"./imgs/{p}"
        with open(path, "rb") as f:
            data = f.read()
        res = doc.classification(data)
        item[p.replace(".png", '').lower()[3:]] = res
    return item

.结果
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值