GlidedSky 字体加密


还是这个网站,字体加密1, 不过这个 1 比较简单。我会写的很详细,大佬轻喷,内容适合新手小白看,也是自己记录一下,方便自己理解查看。

什么是字体加密

字体加密:

`字体文件的本质是,给定字符、字号等参数,输出一组像素点信息,用于在设备上展示。`

特别简单一点来说,就是网页上显示数据和你真实获取到的数据,通过某一种关系表连接起来。这样就可以达到 1 是 2, 3 是 7 的效果。我说的都是比较浅显的理解,可以去百度或者 Google 一下。我截个图理解一下。

mark

上面的图应该可以帮助你理解一下。当然这是简单的字体加密。

破解字体加密

而现在我们需要拿真实的响应数据,根据对应关系,去匹配页面上你所看到的数据。

其实这个对应关系也就是字体文件,需要找到这个字体文件。

第一步:打开网站,打开 network

mark

打开网页你会看到,你看到的和你拿到的数据并不是一致,所以有时候眼睛看到的也不一定是真的。

而且当你刷新页面的时候,你拿到的数据和上一次也不一样,说明字体文件更新了。所以最好把这 1000 页的 HTML 内容保存下来,方便理解。

mark

找到字体文件:

mark

第二步:就是处理这个字体加密

拿到的是 base64 加密的数据,上面的图圈起来的 base64 后面的,不要把前面的内容也搞出来,解密后保存为 ttf 文件。

至于怎么获取这 1000 页的内容,看你自己
直接上代码:
1 、获取页面的 base64 加密的字体文件。使用的库

import requests
from lxml import etree

import tools
import base64
from fontTools.ttLib import TTFont   # 字体解析库
import xml.dom.minidom
from bs4 import BeautifulSoup
f = open(f'page/font-puzzle-{i}.html').read()
soup = BeautifulSoup(f, "html.parser")
html = str(soup.select('style'))
str_base64 = html.split('base64,', 1)[1]
font_face_base64 = str_base64.split(') format', 1)[0]
# base64 解密
b = base64.b64decode(font_face_base64)
# 保存为 ttf 格式的文件
with open('ttfji/{}.ttf'.format(i), 'wb') as f:
    f.write(b)

font = TTFont('ttfji/{}.ttf'.format(i))
# 转为 xml 格式文件,并保存
font.saveXML('dictxml/{}.xml'.format(i))

可以使用工具 FontCreator 打开,给大家百度网盘的链接:

链接: https://pan.baidu.com/s/1xzdNQeOUX7JHACpG3CJb_A 提取码: ebcq 复制这段内容后打开百度网盘手机App,操作更方便哦

打开就是这样:

mark

而 xml 文件中是这样:其实是没有 10 的,name 向上对应就是你打开 ttf 看到的。GlyphOrder 中显示的就是对应关系。

mark

而 name 的值代表的数字,就是自己个翻译过来的数字。可以看看 cmap.

mark

也就是这样:该字体加密恰巧数字对应它自己的英文名。每一个字体加密都需要去找 name 对应的 value .

dict = {
            'zero': '0',
            'one': '1',
            'two': '2',
            'three': '3',
            'four': '4',
            'five': '5',
            'six': '6',
            'seven': '7',
            'eight': '8',
            'nine': '9',
        }

到这里基本就理解完了,剩下的就是怎么获取 xml 中的对应关系,就是写代码了。理解了写代码就容易多了。

newdict = {}
dom = xml.dom.minidom.parse('dictxml/{}.xml'.format(i))
root = dom.documentElement
bb = root.getElementsByTagName('GlyphID')
for j in range(1, 11):
    # 下标从 1 开始,获取的是zero,
    k = bb[j].getAttribute("name")
    # 在字体文件 xml 中对应关系就是 j-1, 也就是0, zero对应的就是0,注释仅针对第一个字体文件
    # 建立对应关系,取出真实的 name 对应的数字。
    newdict[dict[k]] = str(j - 1)

完整代码,公众号后台回复 ‘font’获取。

mark


文章作者: Andrew
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Andrew !
评论
 上一篇
搭建 Hexo 博客,部署到腾讯云和 coding,并从 WordPress 迁移到 Hexo 搭建 Hexo 博客,部署到腾讯云和 coding,并从 WordPress 迁移到 Hexo
搭建 Hexo 博客, 部署到腾讯云偶然之间看到了一个 Hexo 的主题,觉得很爽,而且 WordPress 又很重,所以就想搭建一个 Hexo 博客。 因为之前搭建过 WordPress 博客,所以很多环境我都不需要安装。 看下面这篇文章
2019-11-27
下一篇 
pip 安装库时碰到的错误 AttributeError: 'str' object has no attribute 'decode' pip 安装库时碰到的错误 AttributeError: 'str' object has no attribute 'decode'
python 使用 pip 命令安装库的时候碰到的错误 AttributeError: 'str' object has no attribute 'decode'解决
2019-11-08
  目录