1. 什么是字體加密
簡(jiǎn)單的說(shuō),字體加密即為所復(fù)制非所得。如下圖,我們復(fù)制186.37萬(wàn)字得到萬(wàn)字。那么這里的186.37這個(gè)數(shù)字就被加密了,用到的技術(shù)為字體加密。
網(wǎng)址:/info/
字體加密所用范圍也很廣,如大眾點(diǎn)評(píng)、貓眼、起點(diǎn)中文網(wǎng)、等。如果我們直接抓取頁(yè)面源代碼,得到的則為一堆無(wú)意義的數(shù)據(jù)。 那么如何把這些無(wú)意義的數(shù)據(jù)解密成他原本的含義呢,下面我將進(jìn)行詳細(xì)的講解。
2. 基本知識(shí)2.1 字體加密原理
我們所看到的文字,都有對(duì)應(yīng)的字體文件,字體文件描述著每個(gè)文字如何繪制。比如下圖:
不同的字體文件,繪制出來(lái)的爬蟲(chóng)二字形狀不一樣。這就好比畫(huà)畫(huà)一樣,不同的人畫(huà)貓,有的人畫(huà)出來(lái)的是貓,有人畫(huà)出來(lái)的卻是虎。懂了這點(diǎn),那么下圖的字體加密就不難理解了:
上圖我們看到的土地基本概況 其實(shí)是冋塊基鴻戥況通過(guò)字體文件繪制出來(lái)的,即原本真實(shí)的文字應(yīng)為冋塊基鴻戥況。不信你可以去復(fù)制這幾個(gè)文字,然后粘貼下看看,打開(kāi)原網(wǎng)頁(yè)。就好比我們看到的畫(huà)是虎在線字體轉(zhuǎn)換器可復(fù)制,其實(shí)畫(huà)畫(huà)那人畫(huà)的對(duì)象是貓。
總結(jié)下:我們所看到的文字,是由字體文件繪制出來(lái)的,正常都是將這個(gè)文字原本字形繪制出來(lái)。但遇到字體反爬這種不正經(jīng)的字體文件,他把文字男繪制成人妖這種事都干得出來(lái)。
2.2 字體文件刨析
我們先找到這個(gè)網(wǎng)頁(yè)所用到的字體,并下載下來(lái),用以下幾行代碼來(lái)解析字體保存為xml
from fontTools.ttLib import TTFont
font = TTFont("vJ3z6kV9Oo0MYQNQhaEWLTMF54ysPI1p.woff")
font.saveXML("vJ3z6kV9Oo0MYQNQhaEWLTMF54ysPI1p.xml")
這里解釋下woff字體
WOFF(Web開(kāi)發(fā)字體格式)是一種專(zhuān)門(mén)為了Web而設(shè)計(jì)的字體格式標(biāo)準(zhǔn),實(shí)際上是對(duì)于/等字體格式的封裝,每個(gè)字體文件中含有字體以及針對(duì)字體的元數(shù)據(jù)(),字體文件被壓縮,以便于網(wǎng)絡(luò)傳輸。
下面分析下這個(gè)xml文件:
節(jié)點(diǎn)下為該字體文件中所包含的文字
節(jié)點(diǎn)下,name為所繪制的文字,節(jié)點(diǎn)為字型信息。
xMin、xMax、yMin、yMax 為這個(gè)文字所在的橫縱坐標(biāo),如下圖:
pt 中的 x, y 為關(guān)鍵點(diǎn)的坐標(biāo),on的值 1表示直線,0表示弧形。為了驗(yàn)證on表達(dá)的含義,親自拿標(biāo)準(zhǔn)的微軟雅黑用文字十和八做了驗(yàn)證,如下:
文字八,因?yàn)榘耸怯谢〉模詏n的值有1有0
文字十在線字體轉(zhuǎn)換器可復(fù)制,on均為1
name 為文字名,一個(gè)表識(shí)。標(biāo)準(zhǔn)字體的name即為所繪文字的進(jìn)制編碼。非標(biāo)準(zhǔn)字體name的值是什么,看他心情。我們可以通過(guò)如下方法將文字與16進(jìn)制相互轉(zhuǎn)換。
# 轉(zhuǎn)16進(jìn)制
>>> hex(ord('十'))
'0x5341'
轉(zhuǎn)回文字
>>> u'\u5341'
'十'
2.3 破解字體加密 此方法適用于知道標(biāo)準(zhǔn)字體是什么
2.3.1 思路
看完字體文件刨析之后,我們大致對(duì)字體文件有所了解了。一個(gè)文字張什么樣子是由x、y、on來(lái)決定的。那么當(dāng)我們拿到一個(gè)非標(biāo)準(zhǔn)字體中某個(gè)文字的x、y、on后,在對(duì)應(yīng)的標(biāo)準(zhǔn)字體文件中尋找最相近的x、y、on以及其表達(dá)的文字,這樣所找到的文字即為解密后的文字。
比如下面這個(gè)圖,我們拿土地基本情況中的地來(lái)舉例,從源碼中看出地對(duì)應(yīng)的文字為冋
從源碼中還發(fā)現(xiàn)了標(biāo)準(zhǔn)字體為微軟雅黑
分別將網(wǎng)頁(yè)所用的加密字體及標(biāo)準(zhǔn)的微軟雅黑字體保存為xml,然后分別在微軟雅黑中取地及在加密字體中取冋的字型,對(duì)比如下
先計(jì)算下地與冋的16進(jìn)制
>>> hex(ord('地')) '' >>> hex(ord('冋')) ''
字形對(duì)比
觀察字形可以看到標(biāo)準(zhǔn)字體中的地與加密字體中的冋的字型是非常相近的。x,y的縮放比例相同,on的值更是完全的一致。這是因?yàn)檫@倆字型繪制的都是同一個(gè)文字地。也就是為什么網(wǎng)頁(yè)的源碼中是冋,而我們?cè)陧?yè)面中看到的文字是地
2.3.2 付出行動(dòng)
我們已經(jīng)有了在標(biāo)準(zhǔn)字體文件中尋找最相近字型的思路,那么下面講解如何尋找!
解析標(biāo)準(zhǔn)字體文件,將文字與字型保存為如下關(guān)系
不同文字的on可能相同,因此on的值為list類(lèi)型,下面保存了多個(gè)相同on值的文字及字型
我訓(xùn)練完的字體文件如下
解析加密的字體文件,將每個(gè)文字、on、及xy對(duì)應(yīng)關(guān)系取出來(lái)。然后用on值在上面的字典中快速取出一組on值相同的字型(大多數(shù)只有一個(gè)),然后再在這組字型中匹配一個(gè)最相近的字型,得出對(duì)應(yīng)的文字即可
匹配最相近的字型方法:遍歷候選字型,計(jì)算每個(gè)字型xy的特征與源word xy特征相除后的方差(相除是因?yàn)?同一字體xy是成比例縮放的),然后取方差最小的字型。
總結(jié)
以上分別介紹了什么是字體加密、加密原理、字體文件刨析、以及破解思路。破解思路適用于已知標(biāo)準(zhǔn)字體的情況,對(duì)于未知標(biāo)準(zhǔn)字體的字體反爬,下期講解。