某app协议简单的分析
最近有个小需求,要模拟一下某app的请求协议。正好请假一天办点事儿,完后有一些空余时间,顺便就测试了一下。
请求如下,目标是找到sign的计算方法。

一、反编译&定位
反编译app,搜索关键字可以搜到一些基础字段的涵义。

继续搜索“sign”,可以发现所有的sign都是调用了同一个方法。

进去看一下../core/common/utils/i中的b方法。

简单的从方法的类型(String)、参数(salt)及命名(getSortURL)能大概猜到:先是排序一下,然后加盐算出一个值来。再跟进v,发现a方法就是一个md5算法,同时请求中sign值非常吻合md5的特征,所以可以草率的猜测:sign值计算方法就是将url参数排序,然后加盐再md5。
二、Frida hook验证
接下来就是验证一下,可以用hook的方式打印下日志来对比。由于是java层的代码,这里有两个选择:xposed和frida。
因为懒得写个xposed apk+重启手机,所以这里就采用frida这个神器。具体的环境配置说明就不在啰嗦了,参考网上或者官方文档说明https://www.frida.re/docs/javascript-api/。
这里我使用的版本的11.0.13,注意保持这两个地方的版本一致即可。

然后就是hook一下这个getSortURL方法,打印一下返回值看看。

script也非常简单,设备上运行frida-server和进行端口转发后,打开app运行,然后执行脚本就能看到结果了。

运行脚本,可以看到已经打印到控制台了。

然后md5计算一下,得到值:8a07f79c6a4f86319f9c3eef11f73aa0。与抓包中的请求值一致。

三、总结
1、Frida工具对于逆向者来说真的非常方便,安装环境和配置要求都非常简单,兼容性也非常好,而且支持Java层和Native层hook操作。
2、java层的信息非常容易被反编译得到
3、建议:关键信息建议放在native层,提高逆向的难度(虽然也拦不住)。