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

news2024/11/23 0:13:58

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

目标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

完结!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【历史上的今天】8 月 15 日:苹果推出初代 iMac;谷歌收购摩托罗拉移动;Fuchsia 首次发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 8 月 15 日&#xff0c;在 1878 年的今天&#xff0c;我国第一套邮票发行。中国是一个文明古国&#xff0c;在邮政通信方面&#xff0c;有着悠久的历史。早在三…

C语言实例_和校验算法

一、算法介绍 和校验&#xff08;Checksum&#xff09;是一种简单的纠错算法&#xff0c;用于检测或验证数据传输或存储过程中的错误。它通过对数据进行计算并生成校验和&#xff0c;然后将校验和附加到数据中&#xff0c;在接收端再次计算校验和并进行比较&#xff0c;以确定…

10个经典战略分析模型,助力洞察市场明确优势

在企业的经营管理过程中&#xff0c;要时刻清晰内外部环境和自身的优劣势&#xff0c;做好企业略规划&#xff0c;进行企业内外部资源的分析&#xff0c;对经营环境&#xff0c;企业核心竞争力有足够的判断&#xff0c;才能明确企业的发展方向。本文为大家分享10个常用的战略分…

Leetcode每日一题:833. 字符串中的查找与替换(2023.8.15 C++)

目录 833. 字符串中的查找与替换 题目描述&#xff1a; 实现代码与思路&#xff1a; 哈希表 模拟 原理思路&#xff1a; 833. 字符串中的查找与替换 题目描述&#xff1a; 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个…

ide internal errors【bug】

ide internal errors【bug】 前言版权ide internal errors错误产生相关资源解决1解决2 设置虚拟内存最后 前言 2023-8-15 12:36:59 以下内容源自《【bug】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是h…

数据分析案例丨商品零售购物篮分析(上)

购物篮分析关联规则挖掘应用 将单个客户一次购买商品的总和(以收银台结账为准)称为一个购物篮。那么购物篮分析就是针对商品的相关性进行分析。因为最初这种关联分析主要是在超市应用广泛&#xff0c;所以也称为“购物篮分析”。 购物篮分析是商业领域最前沿、最具挑战性的问…

使用wxPython和PyMuPDF提取PDF页面指定页数的内容的应用程序

在本篇博客中&#xff0c;我们将探讨如何使用wxPython和PyMuPDF库创建一个简单的Bokeh应用程序&#xff0c;用于选择PDF文件并提取指定页面的内容&#xff0c;并将提取的内容显示在文本框中。 C:\pythoncode\new\pdfgetcontent.py 准备工作 首先&#xff0c;确保你已经安装了…

高忆管理:什么是一码通?有什么好处?

在经过券商开户后&#xff0c;除了其间的财物账户、沪深股账户外&#xff0c;还有一个一码通账户&#xff0c;什么是一码通&#xff1f;它有什么好处&#xff1f;关于这些&#xff0c;高忆管理为大家预备了以下参阅内容。 什么是一码通&#xff1f; 一码通账户&#xff0c;一般…

公司电脑三维图纸加密、机械图挡加密软件

机械图纸加密软件的问世&#xff0c;让很多的网络公司都大受其带来的工作中的便利。在安装了机械图纸加密软件后&#xff0c;不仅可以很好的管理员工在工作时的上网娱乐&#xff0c;在对整个公司员工的工作效率上也有着明显的提高&#xff0c;那么对于机械图纸加密软件的具体特…

【数据结构】堆的实现,堆排序以及TOP-K问题

目录 1.堆的概念及结构 2.堆的实现 2.1初始化堆 2.2销毁堆 2.3取堆顶元素 2.4返回堆的大小 2.5判断是否为空 2.6打印堆 2.7插入元素 2.8堆的向上调整 2.9弹出元素 2.10堆的向下调整 3. 建堆时间复杂度 4. 堆的应用 4.1 堆排序 4.2 TOP-K问题 1.堆的概念及结构 …

springboot多模块打包方式

明确子父模块结构 父目录是带modules 大致结构如下&#xff1a; <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…

线程记录(2)

1.线程状态 NEW : 分配内存地址&#xff0c;创建线程 RUNNABLE&#xff1a;&#xff08;就绪/运行&#xff09;调用start()之后&#xff08;/没有调度CPU调度&#xff09; BLOCKED&#xff1a;还未拿到锁&#xff0c;等待、被阻塞&#xff08;拿到synchronized失败状态&…

erp系统是什么,erp系统有哪些品牌

阅读本文&#xff0c;您可以了解&#xff1a;1、erp系统是什么&#xff1b;2、如何选择erp系统&#xff1b;3、erp系统有哪些品牌 一、erp系统是什么 ERP系统是企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统的缩写。它是一种集成的、全面的企业管理…

【笔试题心得】关于正则的一些整理

本文部分内容摘抄整理自 正则表达式 – 教程 | 菜鸟教程 在笔试的过程中&#xff0c;也常常会对正则表达式进行考察&#xff0c;这里对正则表达式的常见用法&#xff0c;做一个学习和总结。 正则表达式的模式可以包括以下内容&#xff1a; 字面值字符&#xff1a;例如字母、数…

Django学习笔记(2)

创建app 属于自动执行了python manage.py 直接在里面运行startapp app01就可以创建app01的项目了 之后在setting.py中注册app01 INSTALLED_APPS ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.c…

源代码加密 | 代码防泄密软件

其实要从技术上做好企业源代码的防泄露就要做好以下两点&#xff1a; 员工电脑本地源码防泄密 对员工本地源码文件采用透明加密方式进行防泄密处理&#xff0c;做到外发打不开。 GIT/SVN服务器防泄密 对版本管理服务器源代码加密进行有效防泄露处理&#xff0c;让员工从服务器…

语雀真的那么好用吗?那是你还没试试Baklib在线知识库/帮助中心

其实他们都是非常好用的在线知识库和协作工具。它提供了丰富的功能和友好的用户界面&#xff0c;让用户可以方便地管理和共享知识。 语雀的使用感受&#xff1a; 首先&#xff0c;语雀具有简洁、直观的界面设计&#xff0c;使得用户能够快速上手。它采用了扁平化的设计风格&a…

/proc/net/dev 最后一行读2次

网络2倍字节量和网速&#xff0c;百思不得其解。 void netdev(SamplePlugin *sample) {FILE *fp;char s[150], itf[10];long long r1, r2, r3, r4, r5, r6, r7, r8, t1, t2, t3, t4, t5, t6, t7, t8;int i0;sample->rb 0;sample->tb 0;fp fopen("/proc/net/dev&…

海国图志#1:这一周难忘瞬间,吐血整理,不得不看

这里记录每周值得分享的新闻大图&#xff0c;周日发布。 文章以高清大图呈现&#xff0c;解说以汉语为主&#xff0c;英语为辅&#xff0c;英语句子均来自NYTimes、WSJ、The Guardian等权威媒体原刊。 存档时段&#xff1a;20230731-20230806 乌克兰&#xff0c;波罗当卡 一名妇…

Swift 5.9 Macros 有哪些新更新

文章目录 前言Macros&#xff08;宏&#xff09;需要了解的关键信息环境准备创建一个宏定义宏实际使用宏 总结 前言 虽然 Swift 6 已经在地平线上浮现&#xff0c;但 5.x 版本仍然有很多新功能-更简单的 if 和 switch 用法、宏、非可复制类型、自定义 actor 执行器等等都将在 …