使用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中的各种装饰器详解
Apr 11 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
对python多线程与global变量详解
Nov 09 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
python实现最速下降法
Mar 24 Python
Python使用configparser读取ini配置文件
May 25 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
如何验证python安装成功
Jul 06 Python
一文详述 Python 中的 property 语法
Sep 01 Python
用Python创建简易网站图文教程
Jun 11 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中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python实现人脸识别代码
2017/11/08 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python子类继承父类构造函数详解
2019/02/19 Python
Python Pandas 箱线图的实现
2019/07/23 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
质检的岗位职责
2013/11/17 职场文书
职工运动会邀请函
2014/02/02 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
美丽人生观后感
2015/06/03 职场文书
大学生村官入党自传
2015/06/26 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书