使用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获得文件创建时间和修改时间的方法
Jun 30 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
python正则分析nginx的访问日志
Jan 17 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
Python 实现交换矩阵的行示例
Jun 26 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
Python爬虫之Selenium实现键盘事件
Dec 04 Python
详解pandas映射与数据转换
Jan 22 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的输入输出流
2007/02/14 PHP
php foreach、while性能比较
2009/10/15 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
分享PHP守护进程类
2015/12/30 PHP
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
web.py中调用文件夹内模板的方法
2014/08/26 Python
python使用Matplotlib画条形图
2020/03/25 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Python如何生成xml文件
2020/06/04 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
幼师自荐信
2013/10/26 职场文书
单位消防安全制度
2014/01/12 职场文书
竞聘书格式及范文
2014/03/31 职场文书
2014年学校工作总结
2014/11/20 职场文书
小学班主任事迹材料
2014/12/17 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
Python Flask实现进度条
2022/05/11 Python