使用Python自动化破解自定义字体混淆信息的方法实例


Posted in Python onFebruary 13, 2019

注意:本示例仅供学习参考~

混淆原理

出于某种原因,明文信息通过自定义字体进行渲染,达到混淆目的。

举个例子:

网页源码 <p>123</p> 在正常字体的渲染下,浏览者看到的是 123 这 3 个数字。

如果创建一种自定义字体,把 1 渲染成 5,那么浏览者看到的便是 523 这 3 个数字。

这样便达到混淆信息的效果,常见于对付爬虫之类的自动化工具。

破解方法

下载自定义字体文件(通常在 css @font-face 中找到),保存成 a.ttf 文件。

安装以下依赖项目

  1. tesseract 4.0 及以上版本,以及简体中文(chi_sim)和英文(eng)数据文件。
  2. python tesserocr 最新源码(github)版本。
  3. python fonttools 库。
  4. python pillow 库。

运行以下代码

# -*- coding: utf-8 -*-
本例采用 tesseract OCR 引擎,根据字体文件自动生成密文与明文的字符映射表,实现解密功能。
@author: 李毅
from tesserocr import PyTessBaseAPI, PSM
from PIL import Image, ImageDraw, ImageFont
from fontTools.ttLib import TTFont
import string
class OCR(object):
 default_config = {
 # ocr engine
 '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']
 if c['white_list']:
  self.api.SetVariable('tessedit_char_whitelist', c['white_list'])
 if c['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)
 return self.api.GetUTF8Text().strip()
 def is_char_in_font(self, char):
 for t in self.font_tool['cmap'].tables:
  if t.isUnicode():
  if ord(char) in t.cmap:
   return True
 return False
 def predict(self, char):
 ''' 返回转换后的字符,或空串'' '''
 if not self.is_char_in_font(char):
  return char # 若字体无法渲染该字符,则原样返回。此处可酌情移除。
 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()
 if c2 == self.empty_char:
  return '' # 某些字符可能渲染成空白,此时返回空串。
 return c2
class Decoder(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()
 def decode(self, char):
 if char not in self.cache:
  c2 = self._decode_when_cache_miss(char)
  self.cache[char] = c2 or char
 return self.cache[char]
 def _decode_when_cache_miss(self, char):
 ocr = self.ocr_other
 if char in string.digits:
  ocr = self.ocr_digit
 elif char in string.ascii_letters:
  ocr = self.ocr_letter
 return ocr.predict(char)
if __name__ == '__main__':
 s = '''你好,青划长务, 8175-13-79'''
 d = Decoder('tessdata/', 'a.ttf')
 print(''.join(map(d.decode, s)))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
深入讲解Python中面向对象编程的相关知识
May 25 Python
python基础知识小结之集合
Nov 25 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
Python数据类型之Dict字典实例详解
May 07 Python
Python如何实现转换URL详解
Jul 02 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 #Python
对python_discover方法遍历所有执行的用例详解
Feb 13 #Python
django2.0扩展用户字段示例
Feb 13 #Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 #Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 #Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 #Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 #Python
You might like
php Memcache 中实现消息队列
2009/11/24 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
JS打印组合功能
2016/08/04 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
python导入时小括号大作用
2017/01/10 Python
用python实现的线程池实例代码
2018/01/06 Python
Python内置函数reversed()用法分析
2018/03/20 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
程序员机试试题汇总
2012/03/07 面试题
工业设计专业推荐信
2013/10/29 职场文书
机关节能减排实施方案
2014/03/17 职场文书
禁烟标语大全
2014/06/11 职场文书
综艺节目策划方案
2014/06/13 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
2014年新教师工作总结
2014/11/08 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
董事长新年致辞
2015/07/29 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
Python3中最常用的5种线程锁实例总结
2021/07/07 Python