当前位置:脚本大全 > > 正文

python改变字体颜色指令(使用Python自动化破解自定义字体混淆信息的方法实例)

时间:2022-03-29 03:05:51类别:脚本大全

python改变字体颜色指令

使用Python自动化破解自定义字体混淆信息的方法实例

注意:本示例仅供学习参考~

混淆原理

出于某种原因,明文信息通过自定义字体进行渲染,达到混淆目的。

举个例子:

网页源码 <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 库。

运行以下代码

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • # -*- 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)))
  • 总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。如果你想了解更多相关内容请查看下面相关链接

    原文链接:https://segmentfault.com/a/1190000015337086

    上一篇下一篇

    猜您喜欢

    热门推荐