一、目标

一、目标

我们来分析某生活服务App的返回数据加密问题,先打开首页的一篇文章,抓包结果:

main
1:main

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

adm
1:adm
  • 首先选中要查看的进程,然后点击红框处的按钮 " 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;
}

跑一下结果出来了,收工。

rc
1:rc

三、总结

善用sdk自带的工具,往往事半功倍。

100

关注微信公众号,最新技术干货实时推送

100