破解百词斩单词数据之旅

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]

 

       前先后后用了两天,也算基本搞清楚了百词斩单词数据部分的相关细节。我的有两个感想,第一,看上去数据解析很简单明了,这是在知道的状况下,其实在破解过程当中并不如是,就比如让你蒙眼走路,即便再熟悉的一条路也是有必定的挑战,你不得不凭借你的其余感官,综合判断方向,还要不断的尝试并忍受无劳的失败;另一个,就是大多数公司对数据安全的重视程度不够,不管如何,数据都是应用的一个基石,没有任何的防范仍是略显不足,尽管你觉得二进制对人类而言是不可解析的。

       好了,就像作一道数学题,最终解决答案的那一刹那当然会带来很大的快感,但解题中思路摸索的过程,反而更能带来无穷的回味。

相关文章
相关标签/搜索