安卓逆向 - 某麦网 x-mini-wua x-sgext x-sign x-umt x-utdid

本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!

目标app: 5aSn6bqm572ROC41LjQ=

目标接口:aHR0cHM6Ly9hY3MubS50YW9iYW8uY29tL2d3L210b3AuZGFtYWkud2lyZWxlc3MuZGlzY292ZXJ5LmRldGFpbC5nZXQvMS40Lw==

一、引言

接上一篇 安卓逆向 - Frida Hook(抓包实践)_小馒头yy的博客-CSDN博客​​​​​​

我们抓到了某麦网帖子详情的包,发现其中存在  x-mini-wua x-sgext x-sign x-umt x-utdid等加密参数,今天来分析其签名生成(al系app通用签名套路),并搭建RPC实现主动调用。

二、搜索大法,定位关键代码

1、打开 jadx,点击文本搜索 - 选择代码 -  输入x-sign字段,发现如下多个关键位置。我们依次点开分析。并使用Frida hook主要方法,判断是否有走这一段代码。

定位到如下关键代码:

String str9 = unifiedSign.get("x-sign");

关注这段代码的上下文,我们发现 x-mini-wua x-sgext x-sign x-umt x-utdid等参数都是由 iSign.getUnifiedSig() 生成。

 HashMap<String, String> unifiedSign = iSign.getUnifiedSign(hashMap3, hashMap4, str5, str6, z2);

 

三、动态调试

我们跟进去,发现这是一个接口,继续找该接口的实现类。

    HashMap<String, String> getUnifiedSign(HashMap<String, String> hashMap, HashMap<String, String> hashMap2, String str, String str2, boolean z);

选中接口 ISign,右键查找用例,寻找该接口的实现类。

 最终我们定位到 mtopsdk.security.InnerSignImpl类的 getUnifiedSign() 

 hook 之:

// mtopsdk.security.InnerSignImpl
function hook5() {
    console.log("hook5 start..")
    var Build = Java.use('mtopsdk.security.InnerSignImpl');
    var JSONObject = Java.use("com.alibaba.fastjson.JSONObject");
    Build.getUnifiedSign.overload('java.util.HashMap', 'java.util.HashMap', 'java.lang.String', 'java.lang.String', 'boolean').implementation = function (a, b, c, d, e) {
        console.log('参数 a: ' + a)
        console.log('参数 b: ' + b)
        console.log('参数 c: ' + c)
        console.log('参数 d: ' + d)
        console.log('参数 e: ' + e)

        //     showStacks()
        var res = this.getUnifiedSign(a, b, c, d, e)
        console.log("res: " + res)
        return res;
    }
}

 console.log("res: " + res) 语句输出的内容和我们抓包得到的数据一致。观察其入参都是明文,我们可以以此搭建RPC环境, 实现主动调用。

四、搭建 RPC,实现主动调用

1、获取内存中的 InnerSignImpl类对象

getMemoryObj: function (result) {
        if (result == null || result === '' || result === undefined) {
            Java.perform(function () {
                console.log("begin");
                Java.choose("mtopsdk.security.InnerSignImpl", {
                    onMatch: function (x) {
                        console.log("choose" + x);
                        result = x;
                    },
                    onComplete: function () {
                        console.log("end");
                    }
                })
            })
        }
        return result;
    }

2、封装参数:主要是 hashMap, hashMap2这两个参数,其他三个写死即可。特别注意data参数传的是一个json字符串,需要转义

            var HashMap1 = Java.use('java.util.HashMap').$new();
            HashMap1.put("deviceId", null);
            HashMap1.put("appKey", "23781390");
            HashMap1.put("utdid", "ZL4dqtfxPh0DALSURGw7eDIY");
            HashMap1.put("x-features", "27");
            HashMap1.put("ttid", "10005884@damai_android_8.5.4");
            HashMap1.put("v", "1.4");
            HashMap1.put("sid", null);
            HashMap1.put("t", "1691142277");
            HashMap1.put("api", "mtop.damai.wireless.discovery.detail.get");
            HashMap1.put("data", "{\"contentId\":\"10726085\",\"appType\":\"1\",\"source\":\"10101\",\"osType\":\"2\",\"pageSize\":\"30\",\"pageIndex\":\"1\",\"version\":\"6000168\",\"channel_from\":\"damai_market\"}");
            HashMap1.put("uid", null);

            var HashMap2 = Java.use('java.util.HashMap').$new();
            HashMap2.put("pageName", "");
            HashMap2.put("pageId", "");

3、调用

 res = rpc.exports.remoteObj.getUnifiedSign(HashMap1, HashMap2, "23781390", "", false);

4、搭建Python服务,加载 dm_rpc.js 代码

def begin():
    global script
    # 加载 js
    while True:
        try:
            process = frida.get_device_manager().get_device(ip + ":" + port).attach(package)
            break
        except BaseException as e:
            print('获取。。。')
    with open("dm_rpc.js", 'r', encoding='utf-8') as js:
        jscode = js.read()
    script = process.create_script(jscode)
    script.load()
    # 启动服务
    app.run(debug=True, port=8006)

if __name__ == "__main__":
    ip = '127.0.0.1'
    port = '21563'
    package = 'cn.damai'
    begin()

5、开放接口给外部访问:

@app.route('/sign', methods=['get'])
def sign():
    par = request.args.get("key")
    params = str(par)
    res = script.exports.signature(params)
    return res

完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/74984.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue element 多图片组合预览

定义组件&#xff1a;preview-image <template><div><div class"imgbox"><divclass"preview-img":class"boxClass"v-if"Imageslist 3 ||Imageslist 5 ||Imageslist 7 ||Imageslist 8 ||Imageslist > 9"&…

IK分词器升级,MySQL热更新助一臂之力

ik分词器采用MySQL热更新 ​ 官方所给的IK分词器只支持远程文本文件热更新&#xff0c;不支持采用MySQL热更新&#xff0c;没关系&#xff0c;这难不倒伟大的博主&#xff0c;给哈哈哈。今天就来和大家讲一下如何采用MySQL做热更新IK分词器的词库。 一、建立数据库表 CREATE…

Vue-4.编译器VsCode

准备 Vue-1.零基础学习Vue Vue-2.nodejs的介绍和安装 Vue-3.vue简介 为什么用VsCode VsCode 是Vue官网首推的编译器它是完全免费的 下载安装VsCode 下载地址 安装的时候不停地下一步直到完成即可 安装插件 安装汉化插件 要将 Visual Studio Code&#xff08;VSCode&am…

回归预测 | MATLAB实现基于LSSVM-Adaboost最小二乘支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于LSSVM-Adaboost最小二乘支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于LSSVM-Adaboost最小二乘支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现L…

elasticsearch-head 插件

1、elastic 插件说明 **Head** 是第三方提供的一款很优秀的插件&#xff0c;集监控、查询、配置一体的web功能系统&#xff0c;可以在系统中进行创建、删除索引 、文档。以及查询、配置索引等功能&#xff0c;深受广大开发者的喜爱 **Kopf** 是另一个第三方提供的一款很优秀…

云原生k8s---资源限制、探针

目录 一&#xff1a;资源限制 1、资源限制原因 2、Pod 和 容器 的资源请求和限制 3、CPU 资源单位 4、内存 资源单位 5、事例 &#xff08;1&#xff09;事例一 &#xff08;2&#xff09;事例二 二&#xff1a;重启策略 1、重启策略模式 2、事例 三&#xff1a;探针…

微信小程序实现左滑删除

一、效果 二、代码 实现思路使用的是官方提供的 movable-area&#xff1a;注意点&#xff0c;需要设置其高度&#xff0c;否则会出现列表内容重叠的现象。由于movable-view需要向右移动&#xff0c;左滑的时候给删除控件展示的空间&#xff0c;故 movable-area 需要左移 left:…

视觉学习(七)---Flask 框架下接口调用及python requests 实现json字符串传输

在项目实施过程中需要与其他系统进行接口联调&#xff0c;将图像检测的结果传递给其他系统接口&#xff0c;进行逻辑调用。这中间的过程可以通过requests库进行实现。 1.安装requests库 pip install requests2.postman 接口测试 我们先通过postman 了解下接口调用&#xff0…

linux系统服务学习(二)linux下yum源配置实战

文章目录 Linux下yum源配置实战一、Linux下软件包的管理1、软件安装方式2、源码安装的配置过程3、详解源码安装的配置过程&#xff08;定制&#xff09;4、详解编译过程5、安装过程6、axel多线程下载软件源码安装7、使用软链接解决command not found8、使用环境变量解决command…

springcloud3 hystrix实现服务降级,熔断,限流以及案例配置

一 hystrix的作用 1.1 降级&#xff0c;熔断&#xff0c;限流 1.服务降级&#xff1a; A方案出现问题&#xff0c;切换到兜底方案B&#xff1b; 2.服务熔断&#xff1a;触发规则&#xff0c;出现断电限闸&#xff0c;服务降级 3.服务限流&#xff1a;限制请求数量。 二 案例…

【机器学习5】数据处理(二)Pandas:表格处理

Pandas:表格处理 &#x1f31f;&#x1f31f;Pandas三种数据类型✨✨Series数据结构✨✨ DataFrame数据结构&#x1f319;&#x1f319;DataFrame数据的选取&#x1f315;&#x1f315;DataFrame的构建&#x1f315;&#x1f315;选取多行&#x1f315;&#x1f315;选取某一列…

【广州华锐视点】VR燃气轮机故障判断模拟演练系统

VR燃气轮机故障判断模拟演练系统由广州华锐视点开发&#xff0c;是一款基于虚拟现实技术的教育工具&#xff0c;旨在为学生提供一个安全、高效、互动的学习环境&#xff0c;帮助他们更好地掌握燃气轮机的故障诊断技能。 这款VR实训软件能够模拟真实的燃气轮机故障诊断场景&…

JVM---理解jvm之对象已死怎么判断?

目录 引用计数算法 什么是引用 可达性分析算法&#xff08;用的最多的&#xff09; 引用计数算法 定义&#xff1a;在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1…

利用python实现批量登录网络设备进行日常巡检

利用python实现批量登录网络设备 实现ensp与物理机互通ensp 配置配置网络设备远程登录 用python实现批量登录常见问题 通过阅读本文可以学习自动化运维相关知识&#xff0c;本文章代码可以直接使用&#xff0c;通过批量登录功能后&#xff0c;可以按照自己意愿进行功能更改与完…

CentOS7最小化安装使用KVM虚拟化

说明&#xff1a;本文初衷在于记录一次实战经验&#xff0c;以便后续参考&#xff0c;不具有任何权威作用&#xff0c;如若对你有帮助深感荣幸&#xff01; 一、环境安装 CentOS Linux release 7.9.2009 (Core)【不带GUI】Xshell 6Xmanager 6 # 执行 export DISPLAY客户端机器…

MongoDB数据库

目录 一、概述 二、安装 三、目录结构 四、MongoDB数据库操作 五、MongoDB数据库备份 一、概述 mongodb是一个nosql数据库&#xff0c;它有高性能、无模式、文档型的特点。是nosql数据库中功能最丰富&#xff0c;最像关系数据库的。数据库格式为BSON 相关概念 实例&…

计算机网络-物理层(二)- 传输方式

计算机网络-物理层&#xff08;二&#xff09;- 传输方式 串型传输与并行传输 串行传输:是指数据是一个比特一个比特依次发送的&#xff0c;因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可 并行传输:是指一次发送n个比特而不是一个比特&#xff0c;因此发送…

电脑ip地址怎么改 ip地址怎么改到别的城市

一、ip地址怎么改到别的城市 1.ip地址怎么改到别的城市&#xff0c;1、重启WIFI路由设备 一般手机或电脑在家或公司上网时都是接入到路由器的WIFI网络,再由路由器分配上网IP地址,如果要更换上网IP那么重启路由器设备后,路由器会向网络运营商进行宽带的重新拨号,此时手机或电脑设…

Gin安装解决国内go 与 热加载

get 方式安装超时问题&#xff0c;国内直接用官网推荐的下面这个命令大概率是安装不成功的 go get -u github.com/gin-gonic/gin 可以在你的项目目录下执行下面几个命令&#xff1a; 比如我的项目在E:\Oproject\zl cmd E:\Oproject\zl>就在目录下执行 go env -w GO111…

推断统计(配对样本t检验)

根据题目我们也可以看出配对样本 t 检验是用来检验两配对正态总体的均值是否存在显著差异的一种假设检验方法&#xff0c;虽然是两组数据但是其来自同一部分个体在两个时间段内的测试数据&#xff0c;是同一部份个体&#xff01; 进行配对样本 t 检验之后也是分别做出原假设和备…