前言
最近在看一个APP,某加密企业壳,登录接口传递的参数加密、存在sign校验。
抓包分析
此时,有两种方式,一种是脱壳分析代码。
另一种是通过Frida脚本直接hook常用的加解密函数、Okhttp等网络类,打印参数和堆栈定位代码。
本次讲述第一种。
脱壳
fart脱壳机脱壳。
也可以通过Frida脱壳脚本脱dex。
登录函数定位
方法1:通过算法助手定位加解密函数,打印堆栈。
算法助手Pro1.0.9 下载地址: https://mp.weixin.qq.com/s/Kcbr1mh45N1BIKrySg39Vg
不过,当前APP存在校验,注入后就停在起始页面。
方法2:Frida分析
APP存在Frida校验,如果最新版的绕不过去,可以尝试去互联网上寻找以前版本的APP。一般来说,非必要APP的接口不会改变,以前的APP也能够使用。
互联网上,常见的xx厂商安全加固的Frida校验有很多。找以前版本的APP,虽然也有Frida校验,但是可以用已有的脚本绕过,比较省事。
objection -g <包名> explore -P .objectionplugins
采用objection插件watch_events
监听onclick点击事件
plugin watch_event onclick
找到位置,我们就可以进行正向分析。但是,有的代码写的比较复杂,正向分析跟代码很容易被绕晕。
因为加密功能是在点击之后,那有没有其他办法?
整个过程:
输入账号密码——》点击按钮——》加密 ——》 发送请求
发送请求这个过程是比较靠后的,我们打印HTTP类的堆栈,跟着堆栈往上找。
工具:https://github.com/r0ysue/r0capture
看r0capture能否抓包我们需要的请求和响应包,r0capture可以打印接口的堆栈信息,再改位置在最下面那几行,名称类似于send、post之类的。
python r0capture.py -U -f com.xxx.xxx -v
在调用的堆栈中找到了发包位置,发包函数为sendPost,复制类名在反编译后的代码中搜索
public XXXHttpResponse sendPost(String strUrlPath, XXXHttpRequestParams params)
判断是不是该接口,可以在objection中hook,打印参数和堆栈
objection无法hook类报错:
原因:加载的类不对。
解决办法:参考我前几天写的文章。
登录协议分析
接着跟着调用栈,寻找到传入明文、传出密文的函数。
最终找到是一个native函数
static { System.loadLibrary("security"); } private static native byte[] aesEncode(String param, String random); private static native String sign(String param, String time);
开发为了方便,将sign校验和加密都放在了一个位置。
后续加解密直接Frida调用即可。
Frida动态hook的好处就是没必要分析具体的加解密过程。
因为是在native层,自定义函数实现的AES加解密,所以上面说的Frida通用加密hook脚本应该是找不到的。
简单说明加密方式:
AES CBC PKS7
key固定写在so文件中
iv是随机的,由key+random取md5的前16位。random放在请求头中一块发送到后端。
sign校验方式:
请求体中的所有内容 + random,拼接后取sha1,然后base64。
总结
对APP的加密请求进行分析,定位到了关键函数。
原文始发于微信公众号(进击的HACK):APP登录接口协议加密函数定位与分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论