使用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计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 Python
python操作CouchDB的方法
Oct 08 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
Python绘制股票移动均线的实例
Aug 24 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
python实现将中文日期转换为数字日期
Jul 14 Python
python 字符串格式化的示例
Sep 21 Python
python实现发送QQ邮件(可加附件)
Dec 23 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内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
介绍一下MD5加密算法
2016/11/12 面试题
质检员的岗位职责
2013/11/15 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
活动费用申请报告
2015/05/15 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
体育教师研修感悟
2015/11/18 职场文书
高一语文教学反思
2016/02/16 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书