本帖最后由 Arcticlyc 于 2023-3-27 07:59 编辑
某图app逆向分析
本次分析仅作学习参考,别无他用,侵权即删。
1. 前言
app可以通过查看之前的帖子了解,由于web端限制图片查看数量,而app上可以浏览全部图片,因此选择逆向分析app。
2. 分析过程
使用到的工具:Charles,jadx,python+frida,r0capture
2.1 抓取数据包
在抓包的过程中发现,使用fiddler、httpcanary等均无法成功抓包,使用trustme模块后也不行。经过分析并搜索后判断app使用了ssl双向验证,因此选择r0ysue的r0capture(https://github.com/r0ysue/r0capture)
项目,成功导出p12证书。
将证书导入Charles后,成功抓取到app的数据包。(此处有个疑惑:我将p12证书导入httpcanary后仍然无法抓取数据包,不知道是何原因,希望有大佬解惑。)
很明显,我们抓取到的是加密后的数据,结合网站加密分析,看起来应该是aes或者des加密,下面分析数据的加密逻辑。
2.2 探究加密方法
app使用了数字加固,低版本安卓可以使用反射大师脱壳,也可以使用frida项目一键脱壳(https://github.com/hluwa/frida-dexdump)。
将得到的dex文件在jadx中打开,经过多次分析后还是认为加密应该在signature内,但是无法找出具体的加密方法。分析过程中可以搜索上面抓到的一些参数(page,data等),搜索出来后可以使用frida进行hook,但是我在尝试多次后仍然没有找到。本来已经没有思路,但是突然想起web端加密中使用到fromhex,因此想到这里应该也要使用同样的方法,经过搜索果然发现了这个方法。
那么接下来看看哪个地方调用了这个方法应该就可以,向上找成功找到了这个decrypt方法,hook这个方法后选择继续往上追溯。
果然找到了这两个方法,其实最开始hook过第二个方法,但是没有结果就以为上面的方法也不是,结果事实证明上面的函数就是加密之处。
同时在这个类中发现了一个md5方法,而hook出来的iv值是固定的,key值却一直在变化,返回的数据包中每次都有一个类似id的值,直接尝试对id取md5(其实经过了多次查找和分析),发现key值直接出来了。
至此分析完毕,采用AES的CBC加密模式,传入一个变化的key和固定的iv值,解密获取数据。
3. 复现数据解密
使用python的requests-pkcs12库传入p12证书,并设置verify为False即可成功请求。具体解密代码可参考之前的web端加密。
4. 总结
成功分析出加密方法后,感觉其实app的加密难度并不是很大,主要是中间走了一些弯路。在这次分析和之前对另一个app的分析中,frida起到了很大的帮助,在不修改原app的前提下,可以捕获内部的方法,同时还可以对加固应用脱壳,实用性非常大。总的来看分析过程简单,难度较小,不过经验应该值得借鉴。
|