所需设备和环境:
设备:获取root权限的安卓手机
抓包:fiddler + proxyDroid
反编译:jadx-gui,ida
前两天逛知乎,看到一个app,博主介绍了如何解决抓包问题,之后如何抓取数据就没有了,这里接着来看看如何破解这个app的加密参数,并请求拿到数据。这是原帖链接:https://zhuanlan.zhihu.com/p/46433599
抓包
先root手机,安装proxyDroid强制全局代理app,打开fiddler先来抓个包:
成功抓到了列表详情页的数据,下拉刷新两次来看看请求参数有什么变化:
对比可得nonce和sign每次请求都在变,其他参数不是固定就是一些时间戳,所以我们只需破解这两个参数就可以拿到列表详情页的数据。
反编译
jadx中打开app,先来全局搜索nonce:
点进去第一个看看:
运气好像不错,这里定义了一个map,里面都是请求参数的生成方法,按住ctrl,鼠标点击这个a函数,看看nonce的具体内容:
比较好容易理解,是从26个英文字母和10个阿拉伯数字中随机选择6个字符,然后拼接当前时间戳就形成了nonce参数,用python可以轻松实现,不过这里我们使用rpc主动调用来获取参数,以后如果遇到不理解的参数就可以直接主动调用:
接下来看看sign,按住ctrl点击sign跳转到了如下页面:
Sign的加密方法写到了native层去了,那我们只好去分析这个名为tre的so文件了,解压目标apk获取到了如下图这些文件:
So文件就在这个lib文件夹里:
ida中打开这个文件,切换到导出函数Export选项卡,先来直接搜索sign:
直接搜索到了,双击第一个点进去看看详情,都是汇编语言,按F5可以把汇编代码转换为伪C代码,下拉分析一波,看到这里有一个sha1的加密算法,因为在fiddler中看到 sign加密后的内容是40位,而sha1加密后也是40位,因此猜测它就是目标函数,那么先来hook这个函数看看:
这里0x18C6即为j_SHA1Input函数的地址,ida中使用tab键切换到汇编代码就可以获取到:
加1是为何,只记得大学时候学过汇编语言讲到段地址,偏移地址,物理地址这些,猜测和这些知识有关,还需研究,这里先这样用,运行这个脚本看看打印输出:
成功hook到了,但是这个结果是以”=”结尾的,应该是个base64,再来看看伪c代码:
这里果然有一个base64编码,继续来hook这个函数:
运行脚本,得到了结果:
复制这个v10参数到sublime,使用正则表达式把”&”替换成换行符,来看看具体内容:
就是请求参数拼接了一个固定字符串,至此,逆向就全部完成了,总结一下,这个sign参数就是以上字符串先通过base64编码,然后sha1加密,使用python来改写。
请求
代码如下:
运行一波,成功拿到数据:
总结
今天主要介绍了native层hook的方法,虽然 so文件中的伪c代码要有一定的基础才能看懂,但是先不要怕,分析的过程中可以先大胆假设,有frida非常强大的hook功能,就能一步步验证之前的假设。这两次都是静态分析方法,下次我们再来介绍一下动态调试的方法。
最后,以上内容仅供学习交流。
公众号终于获得了留言功能,评论区燥起来啊