中国台湾电子书主流平台之一的读墨Readmoo拥有十分全面的书库,虽然其使用的支付平台为 藍新金流NewebPay 导致不支持银联UnionPay,国内发卡行的VISA/MasterCard也可能拒付,对中国大陆并不友好。
但是出于读墨采用了非常简单的Readium LCP加密形式,我们只要挖出其主密钥或Passphrase,即可完成全盘破解。所以进行了尝试,并在此公开大致思路和流程。
让我们从事后诸葛亮的较为简单的路线来讲解思路。
判定加密方式
随便挑选一本免费电子书作为测试,下载下来后,通过Filza浏览数据目录可以看到一个LCPL文件,EPUB结构里有encryption.xml,图像和XHTML被加密过。
这是典型的Readium LCP加密
寻找解法
打开LCPL文件,可以看到Readmoo使用了RSAv1_5加密用户密钥(User Key)和内容密钥(Content Key)。根据Readium LCP标准,再观察encryption.xml,内容解密都采用SHA256,Key为内容密钥(Content Key),IV直接就是文件头16字节。
那我们的首要目标就是挖出适用于内容密钥解密的RSA私钥。
使用IDA Pro打开可执行文件,观察到Readmoo并没有静态链接OpenSSL库,那么其一定使用了iOS标准API进行解密,即 CCCrypt或CC_SHA256 和 SecKeyDecrypt或SecKeyCreateDecryptedData。
在可执行文件中只有SecKeyDecrypt,那就是它了。
观察CC_SHA256的Xref可以发现其主要用在用户数据收集上,和主解密流程关系不大。而CCCrypt只用在了一个函数上,该函数几乎集成了全部的解密需求。
那就好办了,编写一个frida脚本,直接勾CCCrypt和SecKeyDecrypt即可。
观察抓取到的SecKeyDecrypt第一个参数SecKeyRef的Attributes,发现V_Data项直接就是RSA的二进制表示,而extr标识标记为1,标明该RSA是可导出的。
改进frida脚本,使其直接打印规范的PEM文件到终端,复制保存即可。
解密
用Base64解码LCPL文件中的Content Key,然后读取PEM私钥,使用RSAv1_5进行解密,就得到了直通全部内容的钥匙。
按照encryption.xml中的标记,对文件进行解密即可。