使用Python自动化破解自定义字体混淆信息的方法实例
注意:本示例仅供学习参考~
混淆原理
出于某种原因,明文信息通过自定义字体进行渲染,达到混淆目的。
举个例子:
网页源码
123
在正常字体的渲染下,浏览者看到的是123这3个数字。如果创建一种自定义字体,把1渲染成5,那么浏览者看到的便是523这3个数字。
这样便达到混淆信息的效果,常见于对付爬虫之类的自动化工具。
破解方法
下载自定义字体文件(通常在css@font-face中找到),保存成a.ttf文件。
安装以下依赖项目
- tesseract4.0及以上版本,以及简体中文(chi_sim)和英文(eng)数据文件。
- pythontesserocr最新源码(github)版本。
- pythonfonttools库。
- pythonpillow库。
运行以下代码
#-*-coding:utf-8-*-
本例采用tesseractOCR引擎,根据字体文件自动生成密文与明文的字符映射表,实现解密功能。
@author:李毅
fromtesserocrimportPyTessBaseAPI,PSM
fromPILimportImage,ImageDraw,ImageFont
fromfontTools.ttLibimportTTFont
importstring
classOCR(object):
default_config={
#ocrengine
'data_path':None,
'lang':'chi_sim',
'white_list':None,
'black_list':None,
#image
'font':None,
'image_size':(60,60),
'font_size':30,
'text_offset':(15,15),
}
def__init__(self,config={}):
c=dict(self.default_config)
c.update(config)
self.api=PyTessBaseAPI(path=c['data_path'],lang=c['lang'],psm=PSM.SINGLE_CHAR)
self.img=Image.new('RGB',c['image_size'],color='white')
self.draw=ImageDraw.Draw(self.img)
self.font=ImageFont.truetype(c['font'],size=c['font_size'])
self.text_offset=c['text_offset']
ifc['white_list']:
self.api.SetVariable('tessedit_char_whitelist',c['white_list'])
ifc['black_list']:
self.api.SetVariable('tessedit_char_blacklist',c['black_list'])
self.font_tool=TTFont(c['font'])
self.empty_char=self._predict_empty_char()
def_predict_empty_char(self):
self.api.SetImage(self.img)
returnself.api.GetUTF8Text().strip()
defis_char_in_font(self,char):
fortinself.font_tool['cmap'].tables:
ift.isUnicode():
iford(char)int.cmap:
returnTrue
returnFalse
defpredict(self,char):
'''返回转换后的字符,或空串'''''
ifnotself.is_char_in_font(char):
returnchar#若字体无法渲染该字符,则原样返回。此处可酌情移除。
self.img.paste('white',(0,0,self.img.size[0],self.img.size[1]))
self.draw.text(self.text_offset,char,fill='black',font=self.font)
self.api.SetImage(self.img)
c2=self.api.GetUTF8Text().strip()
ifc2==self.empty_char:
return''#某些字符可能渲染成空白,此时返回空串。
returnc2
classDecoder(object):
def__init__(self,data_path,font):
self.cache={}#缓存已知的映射关系。
OCR.default_config.update(dict(data_path=data_path,font=font))
self.ocr_digit=OCR(dict(
lang='eng',
white_list=string.digits,
black_list=string.ascii_letters,
))
self.ocr_letter=OCR(dict(
lang='eng',
black_list=string.digits,
white_list=string.ascii_letters,
))
self.ocr_other=OCR()
defdecode(self,char):
ifcharnotinself.cache:
c2=self._decode_when_cache_miss(char)
self.cache[char]=c2orchar
returnself.cache[char]
def_decode_when_cache_miss(self,char):
ocr=self.ocr_other
ifcharinstring.digits:
ocr=self.ocr_digit
elifcharinstring.ascii_letters:
ocr=self.ocr_letter
returnocr.predict(char)
if__name__=='__main__':
s='''你好,青划长务,8175-13-79'''
d=Decoder('tessdata/','a.ttf')
print(''.join(map(d.decode,s)))
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
热门推荐
6 保研的祝福语简短
10 年轻20岁祝福语简短
11 朋友结婚祝福语信息简短
12 女孩婚礼贺卡祝福语简短
13 30段点歌简短祝福语
14 虎年春节祝福语图文简短
15 写给后妈祝福语大全简短
16 简短回复生日祝福语
17 校长送毕业祝福语简短
18 毕业立体贺卡祝福语简短