tao系x-mini-wua、x-sign、x-sgext、x-umt


目录

  1. 解决抓不到包
  2. 定位加密位置
    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
        }
    })
  1. 定位加密位置
    抓包发现这四个参数是必需的

在这里插入图片描述

搜索 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

在这里插入图片描述

测试接口

在这里插入图片描述

校验参数,有时候参数加密出来,但不一定可以跑通接口,很多时候是环境、编码、时间戳等参数导致校验没通过

在这里插入图片描述

加密参数没问题的