使用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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。