发新帖

百度阅读文件解密过程

[复制链接]
19845 5
百度阅读文件解密
国内有很多阅读平台,亚马逊kindle、多看阅读、当当阅读、掌阅ireader、京东阅读、百度阅读、qq阅读等,就目前来说国内版权问题也越来越受到重视,这也就使得很多阅读软件使用DRM数字版权保护技术。
目前阅读工具保护主要做到以下两点:

1、        内容保护。主要是通过加密技术来实现,以防止非授权的访问。
2、        完整性保护。防止原作品遭到纂改。


总的来说百度阅读的加密和qq阅读差不多,代码虽然经过混淆,但是经过简单的修复精简还是可以提取到关键性代码,
多看,掌阅的保护比较好,亚马逊,京东阅读,稍微次之,百度阅读,qq阅读,就比较简单了(上面根据我个人尝试解密难度排序)

目前qq阅读,百度阅读 京东阅读已经可以手动解密并得到解密文件,多看、掌阅,难度较大,还在研究中。


下面记录了百度阅读文件解密过程:
工具:xposed工具箱、IDEA、android killer 、模拟器、DDMS
  • xposed工具 主要是监控sd卡中的文件状态
  • IDEA 动态调试smlai 查看各个方法的参数

首先,可先尝试随意打开一本书,并监控sd卡文件变化。



看到在加载json文件之前,
首先访问的/mnt/sdcard/BaiduYuedu/download文件夹中的header.enc文件,
打开header.enc其为base64编码。


内容非常像某种加密的key文件,根据上面日志内容可以发现在加载json文件之前回加载这个文件。
建议可以将关键性代码放so文件中。
接着尝试监控header.enc文件,
接着回到书城重新打开一本书:

查看日志文件,可以查看其调用堆栈,根据堆栈信息找的对应的类:
简单分析可以确定的是关键部分在
com.baidu.yuedu.reader.bdjson.c.a和com.baidu.yuedu.c.a.c;这两个类中
分析过程略去,可以从上面类中提取,一些关键性的方法
由于解密内容过多,展示小部分关键代码:完整在附件中,
[Java] 纯文本查看 复制代码
        private void Decrypt() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException {

                /*
                 * header.enc文件的内容 这里的key内容也是经过加密处理的
                 */
                String Encryptkey = "Mi4wgAQAAElJTW9KcmNqc0thZUFMQUNRWENwRU1abkZEWkFudlN3SnNjY2Jkck5YdnRnL2xUSEtlU3ZWaEkwZGxESExTeTA3RkxrN3JObUphd3FxR1ZBaUNUbC8wMEZyMUNiclBiOHVZYVBkd1lLc0xDZTRaR1lTRElTVTNhKzc2MWh4NXdBbjNWSWZWUVFDWGZ1UXpSaGlUbkkzYjU5cXRCelAyOW9FTFgzOFM5UURmL0xrSkFCRzRBQVVBQkJFUUQzYklTR3FTQ0cwQU0vSFFBREFUQkVNUkhWTmdCTUFEQUJJWWJ2Tm1MMVJXYWhKR1ExdG1ibGQzRFdFUUNCMHc5R2lraHFrZ0JjQWpIeFUzYXVWMmRGTXhBRVUxQUd3QU1PRVRkcjVXWjNWd0VMUVFWRFlBRHc0UU0xUldhaEpXQlRvQUJWTmdCTUFqRHhjbWJwcFdhbEoyQlRjQUJWTmdCT0FERXhjbWJwcFdhbEoyQlRnQUJWTmdCT0FERXg0MllDTWhCRVUxQUdrQU1MRVRnQkNEaEJTNmhCRzYrMFhpNW1FRHRBR00vS3NlZFllVk5vSmM2cVRCZ2pHSU1tR0lCajBSVkRZZ3JCQ3orMFhpNW1FRHRBR00vS3NlZFllVk5vSmM2cVRCQldRZ0RkVTFBRzBCTWVISU1oSDRvQkFRQURJUWJzOGtFTzgzbVpRSjM0MjVqQy84bVF6M2J1bzIyRit0L3NsSEFLVjUxTndCUnM5d25XVmRSZE10cUx2Mnl1NHpEdDJraUhmc0l2Mm45cjZEdDF5ZVRjRndyRm5LT05GS3NEYlJ6aXBLSnRZeHFqbHZLajJMNWZTWHBldHpvd0JsWEcyMk9ONWh0Vy91Y0JYMGI2NVRvd25Ea3RRamNSUUdZYllNZjdKVVdhRFFnQktRaUJDREFORzRBQVVRQUJFUUQzYklTR3FTQ0cwQU1mR0lNdDkyWXVVSFpwRm1ZQVYzYXVWMmRQWVJBSkVRRDNiSVNHcVNDR3dCTWVFVGRyNVdaM1Z3RURRUVZEWUFEdzRRTTF0bWJsZFhCVHNBQlZOZ0JNQWpEeFVIWnBGbVlGTWhDRVUxQUd3QU1PRXpadWxtYXBWbVlITXhCRVUxQUc0QU1RRXpadWxtYXBWbVlITUJDRVUxQUc0QU1RRWpiakp3RUdRUVZEWVFDd3NRTUJHSU1hQnpNd1F6TXdjak0xQXpNeDB3RmFCek13UXpNd2NqTTBBek14MHdGZUFUYnZObUwxUldhaEpHUTF0bWJsZDNEV0VRQ0IwdzlHaWtocWtnQmNBakh4VTNhdVYyZEZNeEFFVTFBR3dBTU9FVGRyNVdaM1Z3RUxRUVZEWUFEdzRRTTFSV2FoSldCVG9BQlZOZ0JNQWpEeGNtYnBwV2FsSjJCVGNBQlZOZ0JPQURFeGNtYnBwV2FsSjJCVGdBQlZOZ0JPQURFeDQyWUNNaEJFVTFBR2tBTUxFVGdCQ0RBRlFRQUIwdzlHaWtocWtnQk5BREFCSWdBQkl3QWdXc0FDQ0RYRKwAAABZY2E9SXFmT3hyYm5yZUdBTUpIUTNoU3ZDb1hQVkRveHBQdmJLQmZSVzFzOXdCYmhVRG1NLzg4RnlJYmtaOVhIdUZZaHA1TVd0WmlvOFNEdmw1bkRiVUxvOFhLSXdRTUxCc0llT3l6VXR6c1VOSzNURVYzOUZQcGZxSDVMY2pvYVRqL1lrRXZSWHNQc3I0QVZ3SnRUbmorZkVNVHV1SERoR1Q0N3VKdmNWdFN3";
                /*
                 * 解密Encryptkey,查看下面方法可以知道 Encryptkey做了RSA处理
                 * Encryptkey中包含了RSA的密匙和经过处理得到的AES的key
                 */
                decryptAndGetPublicKey(Base64.decode(Encryptkey.getBytes(), 0));
                int v7 = 131072;
                byte[] result = new byte[v7];
                int start = 0;
                int srcfilelength = ((int) new File(this.b).length());
                do {
                        // 这里读取加密json文件
                        int v2 = a(result, this.b, ((long) start), ((long) (start + v7)));
                        if (v2 <= 0) {
                                return;
                        }
                        start += v2;
                        if (cipher == null) {
                                // 对处key进行扩展 ,由16位key扩展为32位,空白填充16,接着进行初始化
                                // =====这里也是我不明白的地方,为什么要扩展====
                                //在win下即使扩展为32 也不能正常使用
                                byte[] aeskey = b(key.getBytes());
                                // 下面是解密相关操作
                                SecretKeySpec v3 = new SecretKeySpec(aeskey, "AES/ECB/NoPadding");
                                cipher = Cipher.getInstance("AES/ECB/NoPadding");
                                cipher.init(2, (v3));
                        }
                        byte[] v1_1 = cipher.update(result, 0, v2);
                        try {
                                // 解密完成后我门写入文件
                                FileOutputStream fileOutputStream = new FileOutputStream(getFilesDir() + "/xxxx.txt");
                                fileOutputStream.write(v1_1);
                                fileOutputStream.flush();
                                fileOutputStream.close();
                        } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }

                } while (start < srcfilelength);

        }

经过解密后的json文件格式化得到


存在的问题:
虽然可以拿到解密后的文件,但是还是存在文件,这部分代码无法在win下运行,网上有朋友说是JCE的文件,但是重新下载了JCE问题依旧存在,哪位大大知道还望指导一下
本人比较菜,如有错误之处,还望给与指导
附件:http://yunpan.cn/cH9kLECtTIvYN  访问密码 c77d


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

精彩评论5

七少月    发表于 2015-10-7 13:10:45 | 显示全部楼层
非常不错,麻麻,既然是key文件,就可以用授权文件破解方法,连解密都省了

举报 使用道具

回复 支持 反对
peterdocter    发表于 2015-10-8 09:42:48 | 显示全部楼层
不错!有空可以再看一下某奇电视的离线解密。。。

举报 使用道具

回复 支持 反对
skyun1314    发表于 2015-10-8 11:31:14 | 显示全部楼层
大神我来看看。。。。。。。。。。。。。。。。。。。。。。。神奇的的技术,我又out了。还能sd卡监控

举报 使用道具

回复 支持 反对
蝌蚪它大爷    发表于 2015-10-8 13:27:35 | 显示全部楼层
SD卡监控,涨姿势了,谢谢分享~

举报 使用道具

回复 支持 反对
cynxwl    发表于 2016-2-15 15:58:54 | 显示全部楼层
这个sd卡监控,是自己写的xposed插件,还是可以下载到的?

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表