注意:本示例仅供学习参考~
混淆原理
出于某种原因,明文信息通过自定义字体进行渲染,达到混淆目的。
举个例子:
网页源码 <p>123</p> 在正常字体的渲染下,浏览者看到的是 123 这 3 个数字。
如果创建一种自定义字体,把 1 渲染成 5,那么浏览者看到的便是 523 这 3 个数字。
这样便达到混淆信息的效果,常见于对付爬虫之类的自动化工具。
破解方法
下载自定义字体文件(通常在 css @font-face 中找到),保存成 a.ttf 文件。
安装以下依赖项目
- tesseract 4.0 及以上版本,以及简体中文(chi_sim)和英文(eng)数据文件。
- python tesserocr 最新源码(github)版本。
- python fonttools 库。
- 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)))
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]