使用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 10 Python
python 除法保留两位小数点的方法
Jul 16 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
基于python 凸包问题的解决
Apr 16 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
Python中使用Lambda函数的5种用法
Apr 01 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
session 的生命周期是多长
2006/10/09 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
js闭包实例汇总
2014/11/09 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
使用Python来开发微信功能
2018/06/13 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
详解python中递归函数
2019/04/16 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
Python实现打印实心和空心菱形
2019/11/23 Python
python基于win32api实现键盘输入
2020/12/09 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
承认错误的检讨书
2014/01/30 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014年药房工作总结
2014/11/22 职场文书
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS