小白 发表于 2015-10-5 14:10:25

百度阅读文件解密过程

百度阅读文件解密国内有很多阅读平台,亚马逊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;这两个类中分析过程略去,可以从上面类中提取,一些关键性的方法由于解密内容过多,展示小部分关键代码:完整在附件中,      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;
                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问题依旧存在,哪位大大知道还望指导一下本人比较菜,如有错误之处,还望给与指导 {:5_136:}
附件:http://yunpan.cn/cH9kLECtTIvYN访问密码 c77d


七少月 发表于 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插件,还是可以下载到的?{:4_87:}
页: [1]
查看完整版本: 百度阅读文件解密过程