字体加密破解

发布时间 2023-04-11 18:21:43作者: niko5960

字体加密破解

原理

字体加密过的网页源代码上写的是特殊符号,通过这个特殊符号在字体文件中的位置来确保在浏览器中显示出正确的信息
需要做的是通过获取到的字体文件,找到这个特殊符号在字体文件中的位置

解密

解密分成两步,第一步找到特殊符号在字体文件中的对应方式
因为字体文件是矢量图,所以可以用坐标来对应特殊符号
找到矢量图和特殊符号的对应方式以后就可以解析以后请求到的数据了

请求字体文件并转化成xml格式

使用from fontTools.ttLib import TTFont来下载和转化字体文件

#请求字体文件
    res = requests.get('https://*********.cn' + str(woff),verify=False).content
	#保存字体文件
    with open('file1.woff','wb')as f:
        f.write(res)
    font = TTFont ('file1.woff')
    font.saveXML ('file1.xml')

找到特殊符号和矢量图坐标的对应方式,并持久化存储下来

存储可以直接写在代码里,或者存在别的地方

def read_xml(xml_path):
    with open(xml_path, "r", encoding="utf-8") as f:
        doc = minidom.parse(xml_path)  #解析xml文件(句柄或文件路径)
        #doc = minidom.parseString()  #解析xml字符串
        root_node = doc.documentElement  #获得根节点

#找到字体文件中绘制字体的节点
#一般woff文件的写法都是一样的,一般是TTGlyph,具体找看看哪个节点下面是坐标的形式
        filename_nodes = root_node.getElementsByTagName('TTGlyph')  # 通过结点名称寻找结点,返回列表
        for filename_node in filename_nodes:
		#在这里获取名字,是为了找对应关系的时候方便对比
            front_name = filename_node.getAttribute("name")
            #这层循环是字体文件中的每个字体
            lines = filename_node.getElementsByTagName("contour")
            #这里存的应该是一个字体中的所有点
            mystr = ""
            for line in lines:
                #这层循环的是每个字体中的线
                points = line.getElementsByTagName("pt")
                for point in points:
                    #这层循环的是每个线的每个点
                    x = point.getAttribute("x")
                    y = point.getAttribute("y")
                    mystr = mystr + "=" + str(x)
                    mystr = mystr + "=" + str(y)
            dic = {
                "name":"",
                "front":mystr,
                "front_name":front_name
            }
			#把获取到的坐标转化成某种字符串,在以后解析数据的时候用来对比
			
            mycol_find.insert_one(dic)