破解百詞斬單詞數據之旅

clip_image0012

 

       做爲一位英語愛好者,百詞斬是我天天都會用的一款APP,這款應用能夠自測詞彙量,並鞏固你的單詞量,確實是一款用心的產品。做爲一名雅思7分選手,我的以爲裏面的發音和例句,對於口語仍是有很大的幫助,能夠邊聽邊讀,作到碎片化的學習。總言而之,推薦你們都體驗一下。 程序員

       再完美的產品也會有瑕疵,個人詞彙量在1.3萬左右,大多數單詞都能比較熟悉,直接斬掉,但也會有零星的生僻詞,我會收藏起來,天天專門鞏固這部分詞彙。用了兩年之久,收藏了八九百個單詞了,對於我而言,這些單詞屬於Panic Zone,須要重點強化的。因此但願針對收藏單詞列表提供針對性的練習模式,具體是什麼模式我就很少想了,專業的人確定比我有經驗。以前跟客服也反饋過一些小問題和建議,並且百詞斬和個人辦公地點都在同一個辦公區,無論有沒有走心,起碼反饋還比較及時,因此我也跟客服提了這樣一個優化收藏列表的需求,並且隨着收藏單詞的增多,嚴重懷疑收藏單詞的查詢性能是有隱患的。 sql

       下面畫風要轉變了,一年多過去了,我提的需求仍是沒着落,斬家千萬不要輕視客戶的需求啊,特別是一個程序員的需求,索性本身動手,豐衣足食。 數據庫

       自己百詞斬提供離線數據包,並且是Android的應用,假如我可以獲取單詞的請求格式,同時可以解析每個單詞的音頻,圖片,例句,再可以解析各個數據庫之間的結構關係。理論上講,這樣就能作出來一個PC版的百詞斬,也就能知足個人個性化需求,而用戶關係這些不太多是二進制文件的形式,而Android上也就只有sqlite數據庫了,這意味着這些數據應該不難解析。初步分析,可行。 安全

       首先找到這些數據都存在什麼位置了,我對Android系統不熟悉,或許是我眼拙,找了好久都沒找到存放路徑,就這幾個文件夾,怎麼就沒有baicizhan這樣讓人眼前一亮的文件夾呢。彷彿當頭一棒,看來敵人沒這麼蠢,靠人肉技術是不行滴。出師不利,只好另闢蹊徑。百詞斬提供離線數據包,若是能夠監控手機的網絡請求,那就能知道他下載的是什麼內容了。查了一下,在Fiddler->Options中開啓代理,以下圖。而後重啓Fiddler。 網絡

 

clip_image0022

 

       在手機端(保證是同一個網段),長摁WiFi信號源,修改網絡,顯示高級,代理設置爲手動選擇Fiddler所在電腦的無線IP,端口爲8888,和Fiddler裏面的端口號一致。 性能

       一切就緒,點擊下載單詞包,yes,we get it!一條條的請求都在Fiddler中獲取。請求消息以下圖: 學習

 

clip_image0042

 

       如上圖,不難猜想,zpk應該就是每個單詞的數據內容,原來單詞是保存在文件裏面而非數據庫中,文件則按照必定的規則來命名。好吧,順藤摸瓜,看看zpk裏面究竟是什麼玩意。下載下來一個zpk,而後在beyond compare下面以16進制方式打開,上闋以下: 優化

 

clip_image0062

 

       好吧,你應該和我同樣不想看下去了,惟一不一樣的是我能繼續忍,繼續看到中間,發現看到了裏面的單詞,音標,例句等ASCII碼的內容,終於有點頭緒了。再繼續向下看,右下角思路是咱們人類的語言啊,沒錯,ASCII碼以下: 加密

 

clip_image0082

 

       能夠看到,這算是裏面的數據清單,包括zpk文件對應的數據和順序,說明這個數據包括一個jpg,一個aac或者mp3的音頻,其中的.是他們的分隔符,對應的是ASCII碼的0X00。也就是說,右下角的這一段至關於整個二進制的一個清單,並且也是按照清單中的順序有前到後排列的。咱們先解析這部分,就能夠知道該zpk文件中有哪些部分,好比png,jpg,mp3或aac等;每個文件都有本身的標示頭和尾,這樣就能夠把該二進制文件分解成對應格式的內容,一個zpk就這樣迎刃而解。 spa

       固然如上都只是猜想而已,仍是須要驗證,另外對比來看看是否有沒有遺漏的字段。好比jpg文件的開頭是FF D8的標識,結尾則是FF D9,咱們手動把這部分的二進制字段截取出來,保存爲jpg格式,果真不出所料。一樣,裏面還有png圖片和aac的音頻。均可以如此獲取,最麻煩的是mp3,我對這個格式不熟悉,發現它沒有固定的頭尾標識,也算一個美中不足吧,致使我寫的zpkParser解析代碼有特殊處理的地方,並且結果仍是有瑕疵(主要是mp3文件在第一或最後位置)。

       至此,整體而言zpk對我就是明碼了,赤裸裸的呈如今個人眼前肆意的享用了。看了一下百詞斬的數據庫,百詞斬總計有六萬多個單詞(這是後話),找了其中幾個zpk運行一下,效果都還能夠,由於我並非真的想要解析出來,點到爲止,就沒有進一步的優化代碼。以下是代碼片斷,根據當前的arrType類型來獲取對應的文件開頭和結尾標識符,進而截取對應的二進制流並保存。畢竟這種事情不太厚道,因此刻意截取了一些不痛不癢的代碼片斷:

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;
}

       固然,我以前破解過Google Earth的數據。相比而言,zpk文件並無加密,也沒有壓縮,並且仍是ASCII碼,因此破解這種程度的數據其實並不複雜。並且我只是作到打哪指哪,而想要作到的是指哪打哪。因此,儘管我知道了單詞文件的格式,但仍是沒有找到用戶和單詞數據之間的映射關係。

       繼續努力,全局搜索下終於找到了百詞斬在手機裏面的存放路徑。我認爲在Android手機上,百詞斬也對本身的數據存放位置作了一些隱藏,由於我用百詞斬比較久了,早起的版本貌似就在存儲卡下baicizhan文件夾,但發現後來他放到了很難找到的位置,在個人華爲手機上對應在Android/data/com.jiongci.com這樣一個目錄下,也是比較隱藏的,裏面的zpk文件夾確定是全部單詞的彙總了,把其餘數據拷到電腦上,看看裏面的邏輯關係。

       個人習慣,先按照大小排序,而後找到我想要分析的文件後,而後在按照格式排序,最後在看看裏面是什麼內容。一些logo,廣告圖片就掠過,首先最大的文件是baicizhantotal.db,這也太明顯了。手機上只能是sqlite嘛。咱們在sqliteman軟件下打開這個數據庫,果真不出所料,在tb_total_topic_resources表中,保存了全部單詞的屬性信息。音標,中英文示意,例句等,前面還有book_id,topic_id等索引信息。這和zpk裏面對應的內容徹底同樣。咱們在創建一個key value的映射上邁出了一小步。

       而後對全部db解析,創建各自關聯,彷彿你在和百詞斬的程序員在進行一次無聲的交流,爲何要這樣設計,多不方便,哦,爲了不這種狀況,爲何會有這麼多重複,容易的單詞。這是一個漫長,晦澀的過程,也是一個絞盡腦汁的過程。

       bookID表,裏面統計了不一樣科目下的id和單詞數目等。可見,考研詞彙有6k多個,其中bookid就是每一類的一個索引值。

 

clip_image0112

 

       想看看雅思核心中的具體的單詞統計,則打開對應的表,以下,topic就是該單詞的惟一id,下面則是zpk的路徑。

 

clip_image0132

 

       我想要的只是收藏單詞的導出功能,因此繼續找,你會找到出錯單詞的統計,固然,還有收藏單詞的數據表。以下,這下你們滿意了吧。

 

clip_image0152

       我也不清楚爲何這裏的id怎麼就不同了呢?因而在Fiddler裏面反覆收藏單詞,查看請求,該功能必需要求在聯網環境下,估計是避免版本管理問題。而後找到兩個已知id的單詞,收藏後對比,這裏面是是id+N這樣一個固定格式,具體N是多少就不說了,因而乎,把id取出來,減掉N,你就能夠獲取到收藏單詞的id,根據id就能夠獲取該單詞的存放路徑,在經過zpkparser就能夠解析。這樣就能知足個人要求了。試了幾個單詞,基本驗證了個人想法。但是仍是不能解釋爲什麼這裏要用這樣一個id的行爲,或許也是由於這種「畫蛇添足」的行爲,致使收藏單詞的不變,進而影響了查找性能。

       固然,人的慾望是無止境的,如今,我已經不知足於收藏的單詞了,何不把全部的單詞都搞下來,這也算一份不錯的英文單詞數據了,畢竟數據到哪裏都是最核心的。好吧,因而就有了下面的這個截圖,百詞斬大部分的單詞都在其中,每一個數字對應一個bookid,包括新概念,囧記,以及雅思托福考研等主要內容。

 

clip_image017[1]

 

       前先後後用了兩天,也算基本搞清楚了百詞斬單詞數據部分的相關細節。我的有兩個感想,第一,看上去數據解析很簡單明瞭,這是在知道的狀況下,其實在破解過程當中並不如是,就比如讓你矇眼走路,即便再熟悉的一條路也是有必定的挑戰,你不得不憑藉你的其餘感官,綜合判斷方向,還要不斷的嘗試並忍受無勞的失敗;另一個,就是大多數公司對數據安全的重視程度不夠,不管如何,數據都是應用的一個基石,沒有任何的防範仍是略顯不足,儘管你覺得二進制對人類而言是不可解析的。

       好了,就像作一道數學題,最終解決答案的那一剎那當然會帶來很大的快感,但解題中思路摸索的過程,反而更能帶來無窮的回味。

相關文章
相關標籤/搜索