*车之家动态字体加密破解
地址: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
.结果