一、目标
我们来分析某生活服务App的返回数据加密问题,先打开首页的一篇文章,抓包结果:
getfeedcontent.bin 这个接口就是我们要的数据,不过很明显,加密的比较彻底,全部都是密文。
二、步骤
返回数据加密和sign定位不一样,没有很明显的sign字符串可以去查,只能从http请求入手
hook okhttp3.OkHttpClient
var OkHttpClient = Java.use("okhttp3.OkHttpClient");
OkHttpClient.newCall.implementation = function (request) {
var result = this.newCall(request);
console.log(request.toString());
var stack = threadinstance.currentThread().getStackTrace();
console.log("http >>> Full call stack:" + Where(stack));
return result;
};
跑一下,没有 getfeedcontent.bin 相关的数据。
hook openConnection 试试
var URL = Java.use('java.net.URL');
URL.openConnection.overload().implementation = function() {
var retval = this.openConnection();
console.log('URL openConnection' + retval);
var stack = threadinstance.currentThread().getStackTrace();
console.log(">>> openConnection Full call stack:" + Where(stack));
return retval;
};
这次运气不错,找到了 getfeedcontent.bin 的请求,不过堆栈却没有什么参考价值。
堆栈唯一告诉我们的也就是App在网络访问这块用了RxJava,我们会看到一堆onNext和onComplete
怎么办?正在一筹莫展之际,突然想起 Android Device Monitor,
Android Device Monitor
- 首先选中要查看的进程,然后点击红框处的按钮 " start method profiling ", 现在就进入到跟踪状态了
- 在App中打开一篇文章,等文章完全加载完毕之后,再点击刚才红框处的按钮,这时的功能是 " Stop Method Profiling ",点击之后停止Method Profiling。稍等片刻,会自动弹出TraceView窗口。
- TraceView窗口Name一栏中显示的方法调用就是需要关注的地方,每一个方法调用都有一个数字编号,不同的方法调用采用不同的颜色区分,点击方法调用左边的加号展开任意一个方法调用都会看到其下有Parents和Children两个子项,Parents表示该方法被哪个方法调用,Children表示该方法调用了哪些方法。所有的方法调用都以链表的形式依次显示,从上往下查看调用情况。
接收数据并解密的函数一定在这次抓到的堆栈里面,我们搜索一下 onRequestFinish ,一共搜到了3处,(在搜索框直接回车可以切换高亮这搜到的三处)。
比较有嫌疑的是 onRequestFinish 之后调用了 resolveDate ,并且返回值还是个 String 。 Hook它看一眼。
var MapiModuleCls = Java.use('com.xxxx.picasso.commonbridge.MapiModule');
MapiModuleCls.resolveData.overload('com.xxxx.archive.DPObject', 'boolean', 'int').implementation = function(a,b,c){
var result = this.resolveData(a,b,c);
console.log("resolveData rc=" + result);
return result;
}
跑一下结果出来了,收工。
三、总结
善用sdk自带的工具,往往事半功倍。
关注微信公众号,最新技术干货实时推送