使用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实现的简单hangman游戏实例
Jun 28 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
python2 与 python3 实现共存的方法
Jul 12 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
对python判断ip是否可达的实例详解
Jan 31 Python
Python实现使用request模块下载图片demo示例
May 24 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
python 利用opencv实现图像网络传输
Nov 12 Python
python3爬虫中多线程的优势总结
Nov 24 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设计模式 FlyWeight (享元模式)
2011/06/26 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
php xhprof使用实例详解
2019/04/15 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
javascript基本语法分析说明
2008/06/15 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
python实现2048小游戏
2015/03/30 Python
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
21行Python代码实现拼写检查器
2016/01/25 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Python中安装easy_install的方法
2018/11/18 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Python Lambda函数使用总结详解
2019/12/11 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
股东合作协议书
2014/04/14 职场文书
员工保密承诺书
2014/05/28 职场文书
门卫岗位职责说明书
2014/08/18 职场文书