自定義字型混淆資訊的自動化破解

2021-09-13 15:18:19 字數 3378 閱讀 2028

注意:本示例僅供學習參考~

出於某種原因,明文資訊通過自定義字型進行渲染,達到混淆目的。

舉個例子:

網頁原始碼在正常字型的渲染下,瀏覽者看到的是123這 3 個數字。

如果建立一種自定義字型,把1渲染成5,那麼瀏覽者看到的便是523這 3 個數字。

這樣便達到混淆資訊的效果,常見於對付爬蟲之類的自動化工具。

中找到),儲存成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 =

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)))

TextView的自定義字型

這裡有兩種實現方法 1 這種實現方法比較簡單。但是只能設定個別的字型,結果可能不是你想要的。winp.settext typeface.default bold winp.settypeface typeface.default bold default bold是系統自帶,當然系統自帶的也有好幾種...

自定義字型的方法

我想有人可能會像我一樣,嘗試搜尋過各種方法,但都不是太理想,有的是載入不成功,有的則是相容性不好,無奈,自己悶頭研究,終於在今天有了個成果,給大家分享一下。這張很明白的展示了各大瀏覽器對字型的支援情況,其中truetype就是ttf格式,這個字型格式標準的瀏覽器都會支援,只有腦殘的ie不認識,它只相...

測試自動化 自動化測試的定義

相關術語 automated testing test tool,automated testing test suite,automated testing test script等.具體參見 http en.wikipedia.org wiki test automation 推薦書籍 1 軟體...