破解某款动漫app的漫画阅读功能
本帖最后由 deoplljj 于 2020-4-24 16:40 编辑其实这款app三年前我还在读高中的时候就有在关注了,当时只是弄懂了这个app漫画阅读的一小部分功能。因为当时只有周六晚上有时间,所以弄了好几个星期(当时也是刚刚入坑网安和CTF,所以进度也很慢)后来因为学业,就放弃了。最近因为某些原因又开始搞这个app,终于成功了!
下面的这个顺序可能不是最优解,也是因为这个app的破解中间隔了刚刚好三年的时间,大家看看图个乐,消遣下就好了。当然,如果能从我这个菜鸟的文章里学到点啥,我是再高兴不过的了~
0x0 在开始之前...
三年前的分析的时候,这个app可以很方便的用Fiddler抓包,但是今年重新分析的时候却弹窗提示"認証局は信頼されていません(证书签发机关不受信任)",推测可能是最近几年更新的时候增加了ssl证书验证,由于Fiddler解密https的需要装一个自签发的证书,所以就被卡下来了。
为了能正常抓包,我们就先把证书校验给破了:
首先MT管理器搜索关键字"ません"
然后在resourses.asrc文件里找到了关键字符常量err_webview_ssl_untrused,继续在dex文件里搜索:
找到的结果为了方便分析,就拿到电脑上Jadx上分析:
搜索sslAlertDialog方法的用例:
进入第三个就是关键代码了:
这一段就是在遇到ssl错误后会弹出错误,然后中断访问的代码,我们回到smali里面将cancel改成proceed就可以做到只弹窗警告不中止访问了:
0x1 分析(三年前完成的部分)
通过抓包了解到,这个app主要前端采用的是基于chromium的网页视图,跳转到浏览漫画的按钮的href是function://comic_viewer?{这里主要是漫画的卷数等基本参数}&binary_url={数字.zip文件的URL},点击之后就会进入ComicViewerActivity,开始加载漫画。这个阅读器内设置了FLAG,禁止截图。
这个机制比较有意思的一点就是他和国内的主流漫画阅读不同,国内的主要是带cookie访问一个临时的接口,一张张下载、读取。这个直接先把一整本漫画全部加载下来的方法在我们国内还是比较少见的。
我们先直接访问这个binary_url里的url去下载这个zip包,万一他直接解压后就是漫画源文件了呢?
结果下载下来是一个完全没有办法打开的文件:
看来...这个漫画浏览器没有那么zz,这个.zip文件大概率是被加密了。
在漫画加载完,进入阅读的状态后,我用已经root的手机访问了一下这个动漫app文件目录下的cache文件夹,发现了文件夹内有刚刚创建的zip文件,拷贝到电脑上,发现这个zip文件和刚刚在服务端下载的大小完全一致,而且这个zip文件是可以打开的!但是这个zip文件还有密码:
这个时候就开始尝试在Jadx里寻找疑似代码。在三年前(2017年),Jadx貌似还没有反混搅的功能,因此找代码比较辛苦,从Activity的入口开始深度查找出来的东西也是一大堆,而且都是混搅后的代码,因此比较困难。最后还是通过大量浏览代码最后找到了jp.co.*.*.*.commonlib.e.b.a这个方法(现在通过Jadx的反混搅功能已经能一眼看出来)其中net.a.a通过之前的一些开发经验看出来是zip4j经过混搅后的net.lingala.zip4j(其实直接在整个包里搜zip4j也能搜出来就是这个包)
红框里的这段代码也像极了zip4j的demo里给压缩包加密码的代码:
zipFile = new ZipFile(zipFile_);
if (zipFile.isEncrypted()) {
zipFile.setPassword(password.toCharArray());
}
于是就可以尝试hook一下这个函数
打开JEB,在这个地方下断点,adb连接手机,开始调试。
程序果然在这个地方停了下来。
F6步进,查看变量窗口,出现了一段奇妙的字符,马上拿去试试解压,果然解压成功了!
三年前的破解也就到此为止了。后面由于学业的原因,就没有继续搞下去了。当时就进行到这里就花了两个多月的时间(每周只有一个周六晚上有时间)期间也走了很多弯路。
比较有意思的是,我在高考后自主招生的面试时候有提到这段经历,考官们好像都对这个挺感兴趣的,虽然最后他们没有让我过复审哈哈哈~
0x2 时隔三年后继续搞第一层加密
虽然三年的时间过去了,但是每次想起这个app心里总还是有一个坎,为什么服务端上的文件和手机目录里保存的zip文件大小完全一致却打不开?是否还有一层加密?
现在通过Jadx发现了一个很奇怪的包,里面都是一堆Base64编码后的字符串,下面还有几个拼接函数。除了加密很难想到这个包还有什么别的用途。于是搜索这个方法的用法:
最后发现了jp.co.*.*.*.*.g.b$a.DownloaderTask函数
这里似乎是一个下载的方法,但是却又使用了拼接后的密码,高度疑似是在使用密钥解密文件。我们在这里下断点,继续上deb,在这个可疑的地方下断点调试
当时看到这个结果我彻底兴奋了!!!一个32位字符,一个16位字符,作为一个CTF菜鸡有感觉到这是AES/CBC加密的密钥和iv!!!这就印证了之前的猜想!
于是写一个解密脚本(有一说一,我安装一个pycrypto库我就安装了一个下午,这个pip安装pycrypto的坑确实有点多...)
一番调整运行后,打开解密后的文件,成功了!
输入之前解出来的第二步的密码,成功!!
这里就算破解完了,也算是解了心中的一个坎吧。由于他的zip文件在服务端的文件名是非常有规则的(纯数字顺序),所以完全可以写一个自动化脚本把他服务端的文件全部拖下来解密(虽然我不会这么做,这是很危险,也是很不道德的行为)
这里顺便吐槽下,在日本,电子书的价格居然和实体书是一模一样的价格的hhhh 路过帮顶! 太高深 看不懂 ailaoshu 发表于 2020-4-24 14:57
太高深 看不懂
第一次发帖,可能有些地方写的不是很清楚{:1_907:} 很强,大佬! 太难懂了,不过还是给大佬点赞 虽然看不懂,但是还是很愿意帮大神们顶一下的。666 太高深 看不懂 虽然看不懂,但是感觉好厉害。。 非常厉害,帮顶!!!!!!!
页:
[1]
2