使用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 解析html之BeautifulSoup
Jul 07 Python
Python json模块使用实例
Apr 11 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
自定义django admin model表单提交的例子
Aug 23 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
python文件排序的方法总结
Sep 13 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
Python入门基础之数字字符串与列表
Feb 01 Python
如何判断pytorch是否支持GPU加速
Jun 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
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
Yii2如何批量添加数据
2016/05/17 PHP
斜45度寻路实现函数
2009/08/20 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
全面理解闭包机制
2016/07/11 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python编写的最短路径算法
2015/03/25 Python
Python应用库大全总结
2018/05/30 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
Python3 合并二叉树的实现
2019/09/30 Python
python 制作磁力搜索工具
2021/03/04 Python
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
人力资源部经理的岗位职责
2014/03/04 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
SQL CASE 表达式的具体使用
2022/03/21 SQL Server