enjoy了哦 发表于 2019-2-7 17:20:50

朗文当代高级词典第五版(英英版)词库提取

本帖最后由 enjoy了哦 于 2019-5-4 10:45 编辑

这是apk文件(来源:360手机助手):
http://zhushou.360.cn/detail/index/soft_id/431302

此应用排版精美,为官方出品,但它的词库做了一定的加密措施,不太好提取。
下面是提取过程。

首先以zip格式解压此apk文件,在解压目录的assets文件夹下,可看到该词典的核心内容:css样式表文件,字体文件,图片文件等。


02/07/201912:27 PM    <DIR>          css
02/07/201912:27 PM    <DIR>          fonts
02/07/201912:27 PM    <DIR>          html
02/07/201912:27 PM    <DIR>          images
11/17/201112:27 PM         1,024,000 pearson5.aa
11/17/201112:27 PM         1,024,000 pearson5.ab
11/17/201112:27 PM         1,024,000 pearson5.ac
11/17/201112:27 PM         1,024,000 pearson5.ad
11/17/201112:27 PM         1,024,000 pearson5.ae
11/17/201112:27 PM         1,024,000 pearson5.af
11/17/201112:27 PM         1,024,000 pearson5.ag
11/17/201112:27 PM         1,024,000 pearson5.ah
11/17/201112:27 PM         1,024,000 pearson5.ai
11/17/201112:27 PM         1,024,000 pearson5.aj
11/17/201112:27 PM         1,024,000 pearson5.ak
11/17/201112:27 PM         1,024,000 pearson5.al
11/17/201112:27 PM         1,024,000 pearson5.am
11/17/201112:27 PM         1,024,000 pearson5.an
11/17/201112:27 PM         1,024,000 pearson5.ao
11/17/201112:27 PM         1,024,000 pearson5.ap
11/17/201112:27 PM         1,024,000 pearson5.aq
11/17/201112:27 PM         1,024,000 pearson5.ar
11/17/201112:27 PM         1,024,000 pearson5.as
11/17/201112:27 PM         1,024,000 pearson5.at
11/17/201112:27 PM         1,024,000 pearson5.au
11/17/201112:27 PM         1,024,000 pearson5.av
11/17/201112:27 PM         1,024,000 pearson5.aw
11/17/201112:27 PM         1,024,000 pearson5.ax
11/17/201112:27 PM         1,024,000 pearson5.ay
11/17/201112:27 PM         1,024,000 pearson5.az
11/17/201112:27 PM         1,024,000 pearson5.ba
11/17/201112:27 PM         1,024,000 pearson5.bb
11/17/201112:27 PM         1,024,000 pearson5.bc
11/17/201112:27 PM         1,024,000 pearson5.bd
11/17/201112:27 PM         1,024,000 pearson5.be
11/17/201112:27 PM         1,024,000 pearson5.bf
11/17/201112:27 PM         974,848 pearson5.bg

其中pearson5.aa至pearson5.bg等33个文件总共加起来有30多兆,占据了apk文件的大部分内容,是词库文件。每一个文件都只有1000KB大小,是对词库文件做的处理,让它不容易被提取。

但是这个做法其实形同虚设。通过以十六进制观察pearson5.aa的文件头:

SQLite format 3...

可知是一个SQLite数据库文件。接着同样以十六进制观察其它的文件名为pearson5的文件,发现格式都非常工整,应该是将原数据库文件按1000KB一块一块地截取而成。

打开Windows的命令提示符,使用copy命令将这33个文件连缀起来,保存为dict.sqlite文件。

将dict.sqlite文件用SQLite程序打开,呈现出清晰的数据库结构,主要内容为entry_a, entry_b, entry_c, ..., entry_z这26张数据表。每张数据表存储了单词释义(pdata数据项)、发音文件名(usa和uk数据项)、词条(word数据项)、词性(pos数据项)等。

但是在这26张数据表中,单词释义(pdata数据项)不是明文存储的。以这个单词fabulous为例,其pdata数据项里面的内容为:

H4sIAAAAAAAAAK1UzW7aQBC+8xRTzg0YG1onopZQcJtIBBBBajmu7QEc1l5rfyD0xKnqK+QFkgfpqepb5AH6DN1dEwdUqUqrHizNzvd9M7Pf2O4WZ2Eu+TaodYuzCyRJGXzsB3MSKcqU6DbLs83PxhfhsDe9HA0N/rh7UPqpWAeoYY85y89ZgqI8TXT6x9f5t/vo5ufuC/1+Z0U2XbPRMX10HZDkxgI6tIxqvmvMBUKavKsrdx47p377tEXarus4pPEG3ajd0UGr1XG8txi3Ir9xQhKvbqX98H2At5JjhnQLC8YSYBzSrOAoRLpG08dwbJvZMNiwPEE+V9QAJmGA8FPvajwI7QSF4/gnjtNynbbnuo0NWdeDGVNAGVvBk4mvjHqv+nMFr6xAKilkSOhL5L7r+c5+gOkSgTOWwZKI50rrFDcCSMyZECA1hZIVNo5rN/fu/qvPcVz6/GHSuwpYrj2OcM44Qs5Ubqpb4GkTa+RbPQVf6C45kExzpNmHSD//tomlWuCLluCXHpgL9tUKH3d3AjT/fDQYjC6HWla927DR3sqlqXqA1v6zI52/caQaLeZIpNJv5WsoKIlRAMoYiNZlmMuU5ZgYzyQnSWqOhIKQjKdGECkJCdMNJOgqVLfE21TIQ0cn4aA3Dfvlh06tsc+po0s3q1/ELx84cjotBAAA

通过观察其他的pdata数据,这应该是通过Base64转换而来的,真是多此一举。将此数据通过Base64解密后,是一堆乱码:


��T�n�@��S�
Z'��Pp�HAj9���^k �ĩ�+����[�� �]T�J�,���}3����ga.�6�u�� $I|�s)ʔ�6˳����7�

��{P��X�a�9��Y��<Mt���������� �~gE6]��1}t���:��j�k�B���+w;�~��Eڮ�8��ݨ��A��q���"�qB�n���}���c�t �`Ҭ�(D�F��pl��0ذ<A>W�&a��S�j<����'��r��纍
Y׃S@[�����z��s��@*)dH�K����~���3�����J�7H̙ 5��6�k7�����q\��aһ
X�=�p�8B�Tn�[�ik�[=_�.9�Ls�هH?����Z���� ��
ww4�|4�.�ZV�۰��ʥ�z����#��q�-�H��o�k((�Q���e�˔��$'Ij������F)                �
$�*T���T�CG'�7
��N��ϩ�K7�_�/8r:-


这加密措施貌似做得不错。但是如果细心一点的话,也是能看出端倪的。

可以观察到,每个pdata数据都是以 H4sIAAAAAAAAA 这13个字符开头的。考虑到每个单词释义都是一个HTML文件,有统一的格式(所以所有单词释义的HTML文件的前几个字符一定是相同的),这就是一个突破口。这种情况说明了唯二的两种可能:
1. 这串数据根本就没有用什么加密方式,顶多是转换编码而已。所以每个pdata数据项的数据头都相同。
2. 如果使用了现代密码学中的私钥加密(流密码、块密码),明文与密文之间虽然是面目全非,但如果每次加密文件时都用同一个密钥初始化,则每个pdata数据项(也就是密文之间)的数据头也会相同。

通过反编译该APP的 smali 代码得到大部分 Java 源码(该应用没有进行代码混淆),没有发现 Cipher 以及 doFinal 等字样(这些是 Java 提供的用于加密解密的类或函数),初步可以确定是上述的第 1 种情况。

根据Base64的规则,取这13个字符中的前12个。但因为这前12个字符中后面8个都是A,代表6个二进制的0,没什么意义,因此真正有用的信息就是 H4sI 这4个字符。

将其进行Base64解密,所得十六进制表示为1F8B08。通过在 filesignatures.net 查找该文件头,可知它是一个gzip压缩文件,文件扩展名为*.gz。

通过Python的 Base64 模块将上述pdata数据转换成二进制gzip文件,最后可读取压缩包内的文件,该文件采用UTF-8编码,为HTML文件,但未标注扩展名。
文件内容为:

<p:Entry>
<p:Head>
<p:HWD>fabulous</p:HWD>
<p:HYPHENATION>fab‧u‧lous</p:HYPHENATION>
<p:PronCodes>
<p:PRON>ˈfæbjləs</p:PRON>
</p:PronCodes>
<p:POS>adj</p:POS>
</p:Head>
<p:Sense id="u2fc098491a42200a.6e2b450a.115037ec1b8.-ad3">
<p:DEF>extremely good or impressive</p:DEF>
<p:SYN>wonderful</p:SYN>
<p:EXAMPLE id="p008-001204322.wav">You look fabulous!</p:EXAMPLE>
<p:EXAMPLE id="p008-001204323.wav">a fabulous meal</p:EXAMPLE>
<p:EXAMPLE id="p008-001823802.wav">The room has fabulous views across the lake.</p:EXAMPLE>
</p:Sense>
<p:Sense id="u2fc098491a42200a.6e2b450a.115037ec1b8.-acc">
<p:GRAM>only before noun</p:GRAM>
<p:DEF>very large in amount or size</p:DEF>
<p:SYN>huge</p:SYN>
<p:EXAMPLE id="p008-001204328.wav">the Duke’s <p:COLLOINEXA>fabulous wealth</p:COLLOINEXA>
</p:EXAMPLE>
</p:Sense>
<p:Sense id="u2fc098491a42200a.6e2b450a.115037ec1b8.-ac5">
<p:GRAM>only before noun</p:GRAM>
<p:DEF>fabulous creatures, places etc are mentioned in traditional stories, but do not really exist</p:DEF>
<p:RELATEDWD>fable</p:RELATEDWD>
</p:Sense>
</p:Entry>

与 ldoceonline.com 的内容似乎相差不多,但却是原汁原味的第五版内容,格式非常清晰。诸位若有兴趣,也可以拿来练练手。



enjoy了哦 发表于 2019-3-21 09:14:04

本帖最后由 enjoy了哦 于 2019-3-21 09:53 编辑

haoduodianying 发表于 2019-3-20 14:11
楼主大神 膜拜中。

楼主所言 : 通过Python的 Base64 模块将上述pdata数据转换成二进制gzip文件

思路:
1. 首先将pdata数据写入一个字符串str中,
2. (载入base64模块后)调用base64.b64decode(str),将结果赋值给另一个变量binary_data。
3. 以二进制写入模式创建一个文件,例如data.gz。
4. 将binary_data写入data.gz中。
5. 关闭该文件data.gz。

上Python代码:
import base64

str = '此处填入pdata数据'
binary_data = base64.b64decode(str)
f = open('data.gz','wb')
f.write(binary_data)
f.close()

然后就可以打开data.gz观察解码出的数据。


如果是Python 3.2 及以上,还可以更方便一些:
import base64
import gzip

str = '此处填入pdata数据'
binary_data = base64.b64decode(str)
dict_content = gzip.decompress(binary_data)
这里的dict_content就是最终的结果,也就是词典的数据。

enjoy了哦 发表于 2019-2-7 21:42:18

jonah_w 发表于 2019-2-7 20:59
放佛打开了加密技术的一小扇门,好像蛮有意思的,想深入研究下。不知能否推荐一些流加密、块加密的资料,如 ...

老实讲,词典软件一般不会用到什么真正的加密技术,除非特别缺心眼的那种。如果想要了解密码学的话,我看的是Introduction to Modern Cryptography 第二版,作者是Jonathan Katz和Yehuda Lindell。这本书最大的特点就是严谨,一个结论的推导能整整有四五页,环环相扣,就像看小说一样,很过瘾!中文教材我就不清楚了,但也有很多资料。

chigre3 发表于 2019-2-7 18:05:03

提供了非常好的经验,加分点赞!

drongh 发表于 2019-2-7 18:12:57

这个牛逼,非常佩服楼主。下次我也来破解一版。谢谢。

文新 发表于 2019-2-7 18:47:57

高手,非常佩服

jonah_w 发表于 2019-2-7 20:44:47

果真技术达人,学到不少,感谢分享宝贵经验{:4_105:}

jonah_w 发表于 2019-2-7 20:59:50

放佛打开了加密技术的一小扇门,好像蛮有意思的,想深入研究下。不知能否推荐一些流加密、块加密的资料,如果能介绍下移动软件中一些常用加密技术就简直太好了,不过这篇文章提到一些技术点也足够研究一会儿了,哈哈。再次感谢。{:4_108:}

498018591 发表于 2019-2-7 21:45:39

牛。受教了。感谢分享

jonah_w 发表于 2019-2-7 21:47:12

enjoy了哦 发表于 2019-2-7 21:42
老实讲,词典软件一般不会用到什么真正的加密技术,除非特别缺心眼的那种。如果想要了解密码学的话,我看 ...

好的,我先记下了。感谢推荐 {:4_104:}

theduck1968 发表于 2019-2-13 21:22:16


Thanks for sharing

anpu21555 发表于 2019-2-15 18:13:50

XIEXIEFENXIANG

wanglin666 发表于 2019-2-18 13:44:48

楼主破译高手

wht1979 发表于 2019-2-18 15:02:41

本帖最后由 wht1979 于 2019-2-18 15:04 编辑

楼主,钱伯斯21世纪安装版的数据文件用文本打开就是有规律的那些问好,你说可以想你这样给弄出来么?

安的就是这个
https://www.pdawiki.com/forum/thread-13997-1-1.html

@O版的帖子里给的安装盘。

enjoy了哦 发表于 2019-2-19 00:56:16

wht1979 发表于 2019-2-18 15:02
楼主,钱伯斯21世纪安装版的数据文件用文本打开就是有规律的那些问好,你说可以想你这样给弄出来么?

...

我看了一下,这个是被加密了的 SQLite 2.1 版本的数据文件,需要输入密码才能查看 SQLite 数据库的存储内容,一般这种就很难破解了。

wht1979 发表于 2019-2-19 08:41:46

enjoy了哦 发表于 2019-2-19 00:56
我看了一下,这个是被加密了的 SQLite 2.1 版本的数据文件,需要输入密码才能查看 SQLite 数据库的存储内 ...

朗文简明活用,还有这个钱伯斯都是有光盘没有字典,可能就是加了密的文件(不懂,猜的)原因。

lihongwu 发表于 2019-2-20 23:53:55

厉害了,钻研精神可嘉!

weihana 发表于 2019-2-22 18:51:02

指明了方向 ,开了眼界,赞!

aa6777347 发表于 2019-2-23 13:18:43

厉害了 楼主

alredstone 发表于 2019-2-26 09:06:28

jonah_w 发表于 2019-2-7 21:47
好的,我先记下了。感谢推荐

默默的上传一个附件,最大只能上传5MB的附件,一个变俩

jonah_w 发表于 2019-2-26 09:54:25

alredstone 发表于 2019-2-26 09:06
默默的上传一个附件,最大只能上传5MB的附件,一个变俩

非常感谢

jonah_w 发表于 2019-2-26 09:55:44

不知楼主是否可以看下这个:
牛津现代英汉双解词典第9版(COD9)(名人电子词典模拟器)
https://www.pdawiki.com/forum/thread-33264-1-1.html?x=294297

能否解密

devil2001 发表于 2019-2-26 19:38:13

学习了,好像开始有点门道了

duwentao1 发表于 2019-3-5 09:18:27

厉害了,学习一下

redj0705 发表于 2019-3-6 02:27:59

天啊!楼主您简直是神人!

zzzz_sleep 发表于 2019-3-19 16:29:24


学习了,特别是文件格式的猜测
页: [1] 2
查看完整版本: 朗文当代高级词典第五版(英英版)词库提取