您好,登錄后才能下訂單哦!
作為一位英語愛好者,百詞斬是我每天都會用的一款APP,這款應用可以自測詞匯量,并鞏固你的單詞量,確實是一款用心的產品。作為一名雅思7分選手,個人覺得里面的發音和例句,對于口語還是有很大的幫助,可以邊聽邊讀,做到碎片化的學習。總言而之,推薦大家都體驗一下。
再完美的產品也會有瑕疵,我的詞匯量在1.3萬左右,大多數單詞都能比較熟悉,直接斬掉,但也會有零星的生僻詞,我會收藏起來,每天專門鞏固這部分詞匯。用了兩年之久,收藏了八九百個單詞了,對于我而言,這些單詞屬于Panic Zone,需要重點強化的。所以希望針對收藏單詞列表提供針對性的練習模式,具體是什么模式我就不多想了,專業的人肯定比我有經驗。之前跟客服也反饋過一些小問題和建議,而且百詞斬和我的辦公地點都在同一個辦公區,不管有沒有走心,起碼反饋還比較及時,所以我也跟客服提了這樣一個優化收藏列表的需求,而且隨著收藏單詞的增多,嚴重懷疑收藏單詞的查詢性能是有隱患的。
下面畫風要轉變了,一年多過去了,我提的需求還是沒著落,斬家千萬不要輕視客戶的需求啊,特別是一個程序員的需求,索性自己動手,豐衣足食。
本身百詞斬提供離線數據包,而且是Android的應用,假如我能夠獲取單詞的請求格式,同時能夠解析每一個單詞的音頻,圖片,例句,再能夠解析各個數據庫之間的結構關系。理論上講,這樣就能做出來一個PC版的百詞斬,也就能滿足我的個性化需求,而用戶關系這些不太可能是二進制文件的形式,而Android上也就只有sqlite數據庫了,這意味著這些數據應該不難解析。初步分析,可行。
首先找到這些數據都存在什么位置了,我對Android系統不熟悉,或許是我眼拙,找了很久都沒找到存放路徑,就這幾個文件夾,怎么就沒有baicizhan這樣讓人眼前一亮的文件夾呢。仿佛當頭一棒,看來敵人沒這么蠢,靠人肉技術是不行滴。出師不利,只好另辟蹊徑。百詞斬提供離線數據包,如果可以監控手機的網絡請求,那就能知道他下載的是什么內容了。查了一下,在Fiddler->Options中開啟代理,如下圖。然后重啟Fiddler。
在手機端(保證是同一個網段),長摁WiFi信號源,修改網絡,顯示高級,代理設置為手動選擇Fiddler所在電腦的無線IP,端口為8888,和Fiddler里面的端口號一致。
一切就緒,點擊下載單詞包,yes,we get it!一條條的請求都在Fiddler中獲取。請求消息如下圖:
如上圖,不難猜測,zpk應該就是每一個單詞的數據內容,原來單詞是保存在文件里面而非數據庫中,文件則按照一定的規則來命名。好吧,順藤摸瓜,看看zpk里面到底是什么玩意。下載下來一個zpk,然后在beyond compare下面以16進制方式打開,上闋如下:
好吧,你應該和我一樣不想看下去了,唯一不同的是我能繼續忍,繼續看到中間,發現看到了里面的單詞,音標,例句等ASCII碼的內容,終于有點頭緒了。再繼續向下看,右下角思路是我們人類的語言啊,沒錯,ASCII碼如下:
可以看到,這算是里面的數據清單,包括zpk文件對應的數據和順序,說明這個數據包括一個jpg,一個aac或者mp3的音頻,其中的.是他們的分隔符,對應的是ASCII碼的0X00。也就是說,右下角的這一段相當于整個二進制的一個清單,而且也是按照清單中的順序有前到后排列的。我們先解析這部分,就可以知道該zpk文件中有哪些部分,比如png,jpg,mp3或aac等;每一個文件都有自己的標示頭和尾,這樣就可以把該二進制文件分解成對應格式的內容,一個zpk就這樣迎刃而解。
當然如上都只是猜測而已,還是需要驗證,另外對比來看看是否有沒有遺漏的字段。比如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就是每一類的一個索引值。
想看看雅思核心中的具體的單詞統計,則打開對應的表,如下,topic就是該單詞的唯一id,下面則是zpk的路徑。
我想要的只是收藏單詞的導出功能,所以繼續找,你會找到出錯單詞的統計,當然,還有收藏單詞的數據表。如下,這下大家滿意了吧。
我也不清楚為什么這里的id怎么就不一樣了呢?于是在Fiddler里面反復收藏單詞,查看請求,該功能必須要求在聯網環境下,估計是避免版本管理問題。然后找到兩個已知id的單詞,收藏后對比,這里面是是id+N這樣一個固定格式,具體N是多少就不說了,于是乎,把id取出來,減掉N,你就可以獲取到收藏單詞的id,根據id就可以獲取該單詞的存放路徑,在通過zpkparser就可以解析。這樣就能滿足我的要求了。試了幾個單詞,基本驗證了我的想法。可是還是不能解釋為何這里要用這樣一個id的行為,或許也是因為這種“多此一舉”的行為,導致收藏單詞的不變,進而影響了查找性能。
當然,人的欲望是無止境的,現在,我已經不滿足于收藏的單詞了,何不把所有的單詞都搞下來,這也算一份不錯的英文單詞數據了,畢竟數據到哪里都是最核心的。好吧,于是就有了下面的這個截圖,百詞斬大部分的單詞都在其中,每個數字對應一個bookid,包括新概念,囧記,以及雅思托福考研等主要內容。
前前后后用了兩天,也算基本搞清楚了百詞斬單詞數據部分的相關細節。個人有兩個感想,第一,看上去數據解析很簡單明了,這是在知道的情況下,其實在破解過程中并不如是,就好比讓你蒙眼走路,即使再熟悉的一條路也是有一定的挑戰,你不得不憑借你的其他感官,綜合判斷方向,還要不斷的嘗試并忍受無勞的失敗;另外一個,就是大多數公司對數據安全的重視程度不夠,無論如何,數據都是應用的一個基石,沒有任何的防范還是略顯不足,盡管你以為二進制對人類而言是不可解析的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。