您好,登錄后才能下訂單哦!
作為一位英語愛好者,百詞斬是我每天都會(huì)用的一款A(yù)PP,這款應(yīng)用可以自測(cè)詞匯量,并鞏固你的單詞量,確實(shí)是一款用心的產(chǎn)品。作為一名雅思7分選手,個(gè)人覺得里面的發(fā)音和例句,對(duì)于口語還是有很大的幫助,可以邊聽邊讀,做到碎片化的學(xué)習(xí)??傃远扑]大家都體驗(yàn)一下。
再完美的產(chǎn)品也會(huì)有瑕疵,我的詞匯量在1.3萬左右,大多數(shù)單詞都能比較熟悉,直接斬掉,但也會(huì)有零星的生僻詞,我會(huì)收藏起來,每天專門鞏固這部分詞匯。用了兩年之久,收藏了八九百個(gè)單詞了,對(duì)于我而言,這些單詞屬于Panic Zone,需要重點(diǎn)強(qiáng)化的。所以希望針對(duì)收藏單詞列表提供針對(duì)性的練習(xí)模式,具體是什么模式我就不多想了,專業(yè)的人肯定比我有經(jīng)驗(yàn)。之前跟客服也反饋過一些小問題和建議,而且百詞斬和我的辦公地點(diǎn)都在同一個(gè)辦公區(qū),不管有沒有走心,起碼反饋還比較及時(shí),所以我也跟客服提了這樣一個(gè)優(yōu)化收藏列表的需求,而且隨著收藏單詞的增多,嚴(yán)重懷疑收藏單詞的查詢性能是有隱患的。
下面畫風(fēng)要轉(zhuǎn)變了,一年多過去了,我提的需求還是沒著落,斬家千萬不要輕視客戶的需求啊,特別是一個(gè)程序員的需求,索性自己動(dòng)手,豐衣足食。
本身百詞斬提供離線數(shù)據(jù)包,而且是Android的應(yīng)用,假如我能夠獲取單詞的請(qǐng)求格式,同時(shí)能夠解析每一個(gè)單詞的音頻,圖片,例句,再能夠解析各個(gè)數(shù)據(jù)庫之間的結(jié)構(gòu)關(guān)系。理論上講,這樣就能做出來一個(gè)PC版的百詞斬,也就能滿足我的個(gè)性化需求,而用戶關(guān)系這些不太可能是二進(jìn)制文件的形式,而Android上也就只有sqlite數(shù)據(jù)庫了,這意味著這些數(shù)據(jù)應(yīng)該不難解析。初步分析,可行。
首先找到這些數(shù)據(jù)都存在什么位置了,我對(duì)Android系統(tǒng)不熟悉,或許是我眼拙,找了很久都沒找到存放路徑,就這幾個(gè)文件夾,怎么就沒有baicizhan這樣讓人眼前一亮的文件夾呢。仿佛當(dāng)頭一棒,看來敵人沒這么蠢,靠人肉技術(shù)是不行滴。出師不利,只好另辟蹊徑。百詞斬提供離線數(shù)據(jù)包,如果可以監(jiān)控手機(jī)的網(wǎng)絡(luò)請(qǐng)求,那就能知道他下載的是什么內(nèi)容了。查了一下,在Fiddler->Options中開啟代理,如下圖。然后重啟Fiddler。
在手機(jī)端(保證是同一個(gè)網(wǎng)段),長(zhǎng)摁WiFi信號(hào)源,修改網(wǎng)絡(luò),顯示高級(jí),代理設(shè)置為手動(dòng)選擇Fiddler所在電腦的無線IP,端口為8888,和Fiddler里面的端口號(hào)一致。
一切就緒,點(diǎn)擊下載單詞包,yes,we get it!一條條的請(qǐng)求都在Fiddler中獲取。請(qǐng)求消息如下圖:
如上圖,不難猜測(cè),zpk應(yīng)該就是每一個(gè)單詞的數(shù)據(jù)內(nèi)容,原來單詞是保存在文件里面而非數(shù)據(jù)庫中,文件則按照一定的規(guī)則來命名。好吧,順藤摸瓜,看看zpk里面到底是什么玩意。下載下來一個(gè)zpk,然后在beyond compare下面以16進(jìn)制方式打開,上闋如下:
好吧,你應(yīng)該和我一樣不想看下去了,唯一不同的是我能繼續(xù)忍,繼續(xù)看到中間,發(fā)現(xiàn)看到了里面的單詞,音標(biāo),例句等ASCII碼的內(nèi)容,終于有點(diǎn)頭緒了。再繼續(xù)向下看,右下角思路是我們?nèi)祟惖恼Z言啊,沒錯(cuò),ASCII碼如下:
可以看到,這算是里面的數(shù)據(jù)清單,包括zpk文件對(duì)應(yīng)的數(shù)據(jù)和順序,說明這個(gè)數(shù)據(jù)包括一個(gè)jpg,一個(gè)aac或者mp3的音頻,其中的.是他們的分隔符,對(duì)應(yīng)的是ASCII碼的0X00。也就是說,右下角的這一段相當(dāng)于整個(gè)二進(jìn)制的一個(gè)清單,而且也是按照清單中的順序有前到后排列的。我們先解析這部分,就可以知道該zpk文件中有哪些部分,比如png,jpg,mp3或aac等;每一個(gè)文件都有自己的標(biāo)示頭和尾,這樣就可以把該二進(jìn)制文件分解成對(duì)應(yīng)格式的內(nèi)容,一個(gè)zpk就這樣迎刃而解。
當(dāng)然如上都只是猜測(cè)而已,還是需要驗(yàn)證,另外對(duì)比來看看是否有沒有遺漏的字段。比如jpg文件的開頭是FF D8的標(biāo)識(shí),結(jié)尾則是FF D9,我們手動(dòng)把這部分的二進(jìn)制字段截取出來,保存為jpg格式,果然不出所料。同樣,里面還有png圖片和aac的音頻。都可以如此獲取,最麻煩的是mp3,我對(duì)這個(gè)格式不熟悉,發(fā)現(xiàn)它沒有固定的頭尾標(biāo)識(shí),也算一個(gè)美中不足吧,導(dǎo)致我寫的zpkParser解析代碼有特殊處理的地方,而且結(jié)果還是有瑕疵(主要是mp3文件在第一或最后位置)。
至此,總體而言zpk對(duì)我就是明碼了,赤裸裸的呈現(xiàn)在我的眼前肆意的享用了??戳艘幌掳僭~斬的數(shù)據(jù)庫,百詞斬總計(jì)有六萬多個(gè)單詞(這是后話),找了其中幾個(gè)zpk運(yùn)行一下,效果都還可以,因?yàn)槲也⒉皇钦娴南胍馕龀鰜?,點(diǎn)到為止,就沒有進(jìn)一步的優(yōu)化代碼。如下是代碼片段,根據(jù)當(dāng)前的arrType類型來獲取對(duì)應(yīng)的文件開頭和結(jié)尾標(biāo)識(shí)符,進(jìn)而截取對(duì)應(yīng)的二進(jìn)制流并保存。畢竟這種事情不太厚道,所以刻意截取了一些不痛不癢的代碼片段:
switch (arrType[i]) {case zpk_mp3: pHeader = mp3Header; pEnd = mp3Header2; break;case zpk_png: pHeader = pngHeader; pEnd = pngEnd; break;case zpk_jpg: pHeader = jpgHeader; pEnd = jpgEnd; break;case zpk_aac: pHeader = aacHeader; pEnd = NULL; break;default: break; }
當(dāng)然,我之前破解過Google Earth的數(shù)據(jù)。相比而言,zpk文件并沒有加密,也沒有壓縮,而且還是ASCII碼,所以破解這種程度的數(shù)據(jù)其實(shí)并不復(fù)雜。而且我只是做到打哪指哪,而想要做到的是指哪打哪。所以,盡管我知道了單詞文件的格式,但還是沒有找到用戶和單詞數(shù)據(jù)之間的映射關(guān)系。
繼續(xù)努力,全局搜索下終于找到了百詞斬在手機(jī)里面的存放路徑。我認(rèn)為在Android手機(jī)上,百詞斬也對(duì)自己的數(shù)據(jù)存放位置做了一些隱藏,因?yàn)槲矣冒僭~斬比較久了,早起的版本貌似就在存儲(chǔ)卡下baicizhan文件夾,但發(fā)現(xiàn)后來他放到了很難找到的位置,在我的華為手機(jī)上對(duì)應(yīng)在Android/data/com.jiongci.com這樣一個(gè)目錄下,也是比較隱藏的,里面的zpk文件夾肯定是所有單詞的匯總了,把其他數(shù)據(jù)拷到電腦上,看看里面的邏輯關(guān)系。
我的習(xí)慣,先按照大小排序,然后找到我想要分析的文件后,然后在按照格式排序,最后在看看里面是什么內(nèi)容。一些logo,廣告圖片就掠過,首先最大的文件是baicizhantotal.db,這也太明顯了。手機(jī)上只能是sqlite嘛。我們?cè)趕qliteman軟件下打開這個(gè)數(shù)據(jù)庫,果然不出所料,在tb_total_topic_resources表中,保存了所有單詞的屬性信息。音標(biāo),中英文示意,例句等,前面還有book_id,topic_id等索引信息。這和zpk里面對(duì)應(yīng)的內(nèi)容完全一樣。我們?cè)诮⒁粋€(gè)key value的映射上邁出了一小步。
然后對(duì)所有db解析,建立各自關(guān)聯(lián),仿佛你在和百詞斬的程序員在進(jìn)行一次無聲的交流,為什么要這樣設(shè)計(jì),多不方便,哦,為了避免這種情況,為什么會(huì)有這么多重復(fù),容易的單詞。這是一個(gè)漫長(zhǎng),晦澀的過程,也是一個(gè)絞盡腦汁的過程。
bookID表,里面統(tǒng)計(jì)了不同科目下的id和單詞數(shù)目等。可見,考研詞匯有6k多個(gè),其中bookid就是每一類的一個(gè)索引值。
想看看雅思核心中的具體的單詞統(tǒng)計(jì),則打開對(duì)應(yīng)的表,如下,topic就是該單詞的唯一id,下面則是zpk的路徑。
我想要的只是收藏單詞的導(dǎo)出功能,所以繼續(xù)找,你會(huì)找到出錯(cuò)單詞的統(tǒng)計(jì),當(dāng)然,還有收藏單詞的數(shù)據(jù)表。如下,這下大家滿意了吧。
我也不清楚為什么這里的id怎么就不一樣了呢?于是在Fiddler里面反復(fù)收藏單詞,查看請(qǐng)求,該功能必須要求在聯(lián)網(wǎng)環(huán)境下,估計(jì)是避免版本管理問題。然后找到兩個(gè)已知id的單詞,收藏后對(duì)比,這里面是是id+N這樣一個(gè)固定格式,具體N是多少就不說了,于是乎,把id取出來,減掉N,你就可以獲取到收藏單詞的id,根據(jù)id就可以獲取該單詞的存放路徑,在通過zpkparser就可以解析。這樣就能滿足我的要求了。試了幾個(gè)單詞,基本驗(yàn)證了我的想法。可是還是不能解釋為何這里要用這樣一個(gè)id的行為,或許也是因?yàn)檫@種“多此一舉”的行為,導(dǎo)致收藏單詞的不變,進(jìn)而影響了查找性能。
當(dāng)然,人的欲望是無止境的,現(xiàn)在,我已經(jīng)不滿足于收藏的單詞了,何不把所有的單詞都搞下來,這也算一份不錯(cuò)的英文單詞數(shù)據(jù)了,畢竟數(shù)據(jù)到哪里都是最核心的。好吧,于是就有了下面的這個(gè)截圖,百詞斬大部分的單詞都在其中,每個(gè)數(shù)字對(duì)應(yīng)一個(gè)bookid,包括新概念,囧記,以及雅思托??佳械戎饕獌?nèi)容。
前前后后用了兩天,也算基本搞清楚了百詞斬單詞數(shù)據(jù)部分的相關(guān)細(xì)節(jié)。個(gè)人有兩個(gè)感想,第一,看上去數(shù)據(jù)解析很簡(jiǎn)單明了,這是在知道的情況下,其實(shí)在破解過程中并不如是,就好比讓你蒙眼走路,即使再熟悉的一條路也是有一定的挑戰(zhàn),你不得不憑借你的其他感官,綜合判斷方向,還要不斷的嘗試并忍受無勞的失敗;另外一個(gè),就是大多數(shù)公司對(duì)數(shù)據(jù)安全的重視程度不夠,無論如何,數(shù)據(jù)都是應(yīng)用的一個(gè)基石,沒有任何的防范還是略顯不足,盡管你以為二進(jìn)制對(duì)人類而言是不可解析的。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。