目录
- 解决抓不到包
- 定位加密位置
Hook加密
搭建RPC服务
主动调用
解决初始化
Flask接入Hook
测试接口
tao系的App基本都离不开x-mini-wua、x-sign、x-sgext、x-umt这个四个参数
1. 解决抓不到包
这个app的底层网络通信的协议并不是普通的http协议,而是自己实现的一套私有协议Spdy。使用Charles、Fiddle等抓包工具对app进行抓包时,你会发现是抓不到包的
我们只需要把协议Spdy hook掉,不让走Spdy协议,就可以抓到包了
反编译后通过关键词定位及分析,只要把这个函数hook为false即可
hook 代码
Java.perform(function () {
var SwitchConfig = Java.use('mtopsdk.mtop.global.SwitchConfig');
SwitchConfig.isGlobalSpdySwitchOpen.overload().implementation = function(){
var ret = this.isGlobalSpdySwitchOpen.apply(this, arguments);
console.log("isGlobalSpdySwitchOpenl "+ret)
return false
}
})
- 定位加密位置
抓包发现这四个参数是必需的
搜索 x-mini-wua 关键词
String X_MINI_WUA = “x-mini-wua”;
接着搜索 X_MINI_WUA
可以看到四个参数是来源于:gUnifiedSecurityComp.getSecurityFactors()
跟进去 getSecurityFactors() 发现是接口
接着继续搜索看看还有哪里调用了getSecurityFactors(),能不能从中发现一些蛛丝马迹。
经过分析,发现getUnifiedSign() 是调用 mUnifiedSign.getSecurityFactors() 并返回对应的结果
Hook加密
但是我们需要的参数是不是就是由这个函数加密得到的你,hook对比一下
hook和抓包对比发现正是这个地方加密得到的
hook 代码:
Java.perform(function () {
var InnerSignImpl = Java.use("mtopsdk.security.InnerSignImpl");
InnerSignImpl["getUnifiedSign"].implementation = function (params, ext, appKey, authCode, useWua, requestId) {
console.log('getUnifiedSign is called' + ', ' + 'params: ' + params + ', ' + 'ext: ' + ext + ', ' + 'appKey: ' + appKey + ', ' + 'authCode: ' + authCode + ', ' + 'useWua: ' + useWua + ', ' + 'requestId: ' + requestId);
var ret = this.getUnifiedSign(params, ext, appKey, authCode, useWua, requestId);
console.log('getUnifiedSign ret value is ' + ret);
return ret;
};
});
hook位置确定了,剩下的就是写成接口主动调用了
搭建RPC服务
这次打算用AsyncHttpServer + Frida 来实现RPC
(先下班了,有时间接着写)
这几天经过测试发现,Frida + AndroidAsync搭建RPC服务会存在比较多问题,如1.有时候会断开,2.性能不高,有时候请求会卡住。有兴趣的可以参考:https://github.com/h1code2/frida_androidAsync_service
最终还是用Flask搭建
主动调用
主动调用的hook代码
但是发现结果是null的,
解决初始化
究竟是什么问题呢,我们hook一下日志函数(这个挺有用的,平时可以用来看是什么错误导致)
可以看出是没有做初始化,看回源码,这里确实是做了一个初始化的
初始化及hook代码:
var MtopConfig = Java.use("mtopsdk.mtop.global.MtopConfig").$new("INNER");
var InnerSignImpl = Java.use("mtopsdk.security.InnerSignImpl").$new();
InnerSignImpl.init(MtopConfig) // 初始化
var result = InnerSignImpl.getUnifiedSign(params_hash,ext_hash,appKey, authCode, useWua, requestId)
传入参数主动调用
Flask接入Hook
测试接口
校验参数,有时候参数加密出来,但不一定可以跑通接口,很多时候是环境、编码、时间戳等参数导致校验没通过
加密参数没问题的