某团app之mtgsig2.4参数分析

news/2024/5/4 23:54:30/文章来源:https://blog.csdn.net/weixin_38819889/article/details/127083359

文章转载于:https://blog.csdn.net/heier_blue/article/details/126394023?spm=1001.2014.3001.5502

本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!

前言

某团 android app mtgsig 参数分析,美食列表接口,版本 11.9.405

这是分析的案例是1.5的版本,最新的版本的2.4目前也研究出来了

文章转载自:android app so 加密算法分析破解|mtgsig unidbg

charles 抓包

在这里插入图片描述
就是它,本文主要分析 mtgsig 参数

java 层分析

在这里插入图片描述

反编译 apk 全局搜索 mtgsig,有个赋值点过去,查找用例

在这里插入图片描述
这里有 hashMap.put 点过去

在这里插入图片描述
这里先是调用了 getBuilder 函数,猜测是获取 url 参数等,在调用 makeHeader

在这里插入图片描述
此函数又调用了 NBridge.main 函数
在这里插入图片描述
NBridge.main 是个 native 函数

libmtguard.so 文件查找

在上述的 NBridge.java 文件里,并没有看到有,so 文件的加载,那 native 函数是在哪个 so 呢

  • 1、可以使用 frida 等工具来分析
  • 2、可以参考别人文章的逻辑来分析
  • 3、可以自己根据经验来分析

根据经验查找也有多种方式,这里就假设你已经阅读了龙哥 csdn 的文章,那就肯定知道 main 函数同时也是初始化函数,既然是初始化哪加载 so 的逻辑,估计也在一起,没错就直接查找 main 函数的交叉引用

在这里插入图片描述
有多个但 111 是初始化直接点过去,该逻辑是在 initNative 函数里,查看交叉引用,哪里调用的

在这里插入图片描述
在这里调用,如果细心点就会发现,上面有个 if,根据名称可以猜测出来跟 so 相关,查看交叉引用

在这里插入图片描述
在 loadSo 函数里,有个 System.loadLibrary 逻辑,加载成功就 isLoaded = true;
在这里插入图片描述
MTGConfigs.MTG 的值正是 mtguard

frida hook

function getProcessId() {var androidProcess = Java.use('android.os.Process');return 'processId: ' + androidProcess.myTid() + ' - ';
}function hook() {var javaString = Java.use('java.lang.String');var NBridge = Java.use('com.meituan.android.common.mtguard.NBridge');var WTSign = Java.use('com.meituan.android.common.mtguard.wtscore.plugin.sign.core.WTSign');WTSign.makeHeader.implementation = function (a, b) {console.log(getProcessId(), 'WTSign.makeHeader.a: ', a);console.log(getProcessId(), 'WTSign.makeHeader.b: ', javaString.$new(a));var res = this.makeHeader(a, b);console.log(getProcessId(), 'WTSign.makeHeader.res: ', res);return res;}NBridge.main.implementation = function (a, b) {console.log(getProcessId(), 'NBridge.main.a: ', a);console.log(getProcessId(), 'NBridge.main.b: ', b);if (b.length === 3) {console.log(getProcessId(), 'NBridge.main.b.0: ', b[0]);console.log(getProcessId(), 'NBridge.main.b.1: ', b[1]);console.log(getProcessId(), 'NBridge.main.b.2: ', b[2]);} else {for (var i = 0; i < b.length; i++) {console.log(getProcessId(), 'NBridge.main.b.i: ', i, ' data: ', b[i]);}}var res = this.main(a, b);console.log(getProcessId(), 'NBridge.main.res: ', res);for (var j = 0; j < res.length; j++) {console.log(getProcessId(), 'NBridge.main.res.j: ', j, ' data: ', res[j]);}return res;}
}function main() {Java.perform(function () {hook();})
}setImmediate(main);// frida -UF -l hook.js
// frida -UF -l hook.js | tee hook.log

使用 frida hook 一下,看看 main 函数的输入输出是啥

在这里插入图片描述
main 函数有两个参数

  • 1、int 203
  • 2、object array,1、固定的 key,2、url相关参数,3、int 数字

下面使用 unidbg 运行 main 函数

unidbg

package com.xiayu.meituan;import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;import java.io.File;
import java.io.IOException;public class MtGsigTest extends AbstractJni {private final AndroidEmulator emulator;private final Module module;private final VM vm;private final DvmClass NBridge;public String apkPath = "apkPath";public String soPath = "soPath";private static LibraryResolver createLibraryResolver() {return new AndroidResolver(23);}private static AndroidEmulator createARMEmulator() {return AndroidEmulatorBuilder.for32Bit().build();}MtGsigTest() {emulator = createARMEmulator();final Memory memory = emulator.getMemory();memory.setLibraryResolver(createLibraryResolver());vm = emulator.createDalvikVM(new File(apkPath));vm.setVerbose(true);DalvikModule dm = vm.loadLibrary(new File(soPath), true);vm.setJni(this);dm.callJNI_OnLoad(emulator);module = dm.getModule();NBridge = vm.resolveClass("com/meituan/android/common/mtguard/NBridge");}public static void main(String[] args) throws IOException {MtGsigTest mtGsig = new MtGsigTest();mtGsig.destroy();}private void destroy() throws IOException {emulator.close();}
}

先把架子搭好,跑起来,没啥问题

call main 111
public void callMain111() {DvmObject<?> strRc = NBridge.callStaticJniMethodObject(emulator, "main(I[Ljava/lang/Object;)[Ljava/lang/Object;",111,new ArrayObject(vm.resolveClass("java/lang/object").newObject(null)));System.out.println("callMain111: " + strRc.getValue());
}

有了前面的分析经验,得知,需要先调用 main 初始化加载函数,跑起来

在这里插入图片描述
这里报了个错误,正常补环境即可,具体的值,可以使用 frida call 或者 jnitrace 获取

写文章之前博主已经补过一遍了,所以这里就直接贴上 frida hook 的代码

function call() {var currentApplication = Java.use("android.app.ActivityThread").currentApplication();var context = currentApplication.getApplicationContext();var PackageManager = context.getPackageManager();var getPackageInfo = PackageManager.getPackageInfo('com.sankuai.meituan', 64);var NBridge = Java.use('com.meituan.android.common.mtguard.NBridge');console.log('NBridge.getDfpId             : ', NBridge.getDfpId());console.log('NBridge.getPicName           : ', NBridge.getPicName());console.log('NBridge.getSecName           : ', NBridge.getSecName());console.log('NBridge.getMtgVN             : ', NBridge.getMtgVN());console.log('PackageManager.GET_SIGNATURES: ', PackageManager.GET_SIGNATURES.value);console.log('PackageInfo.versionCode      : ', getPackageInfo.versionCode.value);console.log('context.getPackageCodePath   : ', context.getPackageCodePath());
}

补完再次跑起来

在这里插入图片描述
这里又报了个错误,前面 frida call 出来了,直接加上

在这里插入图片描述

再次运行,就没啥问题了,结果也正常出来了

代码测试

import requestsurl = "https://apimeishi.meituan.com/meishi/filter/v8/deal/select?isDefaultSelectedFilter=true&wifi-name=&mrnVersion=1.2.490&shoppingmallid=&cityId=1&type=&userid=-1&uuid=000000000000061F472CE89E948AB928A2F51BB092C0AA166069840990766831&poisBeforeInsert=&wifi-cur=&queryId=44285B77-73F5-44E0-98D7-DC5F634265A3&mypos=%2C&wifi-mac=&optimus_risk_level=71&hasGroup=true&locCityId=1&lat=&newStyle=e&lng=&offset=0&mallWeight=&mallIdType=&globalId=&jumpTab=&wifi-strength=&sort=defaults&beacons=%5B%5D&jingangId=&mallFloor=&cateId=1&tagContent=&mallName=&sessionClickedPois=&mallId=&sessionImpressedPois=&silentRefresh=false&newFastScreen=&tagType=&indoors=&optimus_code=10&selectedCityId=1&revisonStrategy=a&ci=1&isLocal=1&mallType=&optimus_uuid=000000000000061F472CE89E948AB928A2F51BB092C0AA166069840990766831&version_name=12.2.204&areaId=-1&globalIdForTag=&cn_pt=RN&utm_source=yijia5&utm_medium=android&utm_term=1200020204&utm_content=61f472ce89e948ab928a2f51bb092c0aa166069840990766831&utm_campaign=AgroupBgroupC0E0Ghomepage_category2_1__a1__c-1024&msid=61f472ce89e948ab928a2f51bb092c0aa1660698409907668311660799751709&p_appid=10&__reqTraceID=0f9cbb78-7e3b-469d-83a0-0406523252ee"payload = {}
mtgsig = get_mtgsig(url, body="")headers = {"mtgsig": mtgsig,'yodaReady': 'native','request-belong': 'com.meituan.android.mrn.container.MRNBaseActivity','pragma-os': 'MApi 1.1 com.sankuai.meituan 12.2.204 yijia5 ONEPLUS_A5010; Android 8.1.0','pragma-mtid': 'D479ED2812615CD','User-Agent': 'AiMeiTuan /OnePlus-8.1.0-ONEPLUS A5010-2034-1080-420-12.2.204-1200020204-D479ED2812615CD-yijia5','isPrefetch': 'true','M-SHARK-TRACEID': '101000000000000061F472CE89E948AB928A2F51BB092C0AA166069840990766831565c9e1660799844476859bd6','userid': '-1','yodaVersion': '1.18.0.150','Host': 'apimeishi.meituan.com'
}response = requests.request("GET", url, headers=headers, data=payload)
print(mtgsig)
print(response.text)

运行结果:

{"a0":"2.4","a1":"9b69f861-e054-4bc4-9daf-d36ae205ed3e","a3":12,"a4":1660800132,"a5":"uv+uksu/vPC9lMiXND1pXsU5Gm+tlzFe+d9sSXleegxRauyGDbj/yR1J7AyIGGQ7YAEaWm/0kR4oOXqfDshKCA4Xjd1HlVglqWnQ8XV7A1UuHvC8zfOz/tP3EHR4tx0IWmP96ucEugk8c7CodjMgxvQZahC0+SLbSMRPaNOVOVFIYGpq0f8s1jk73f9z3CtOvhvO3oPyPLRXoly9tZ4LzsIx+pOP113IL5Tdvo9blUhcUi3fboqeS3yOe2MS9FqD7mZqWNIcL5nQMqgvCfI=","a6":0,"a7":"hEG1VpFrhBvpntte3QGRr39Dkea+/Eyd+BwufDgp7UoGEGyR2pkjMzXkR9O6He82jYvt8WBv+iVYMP17HM+2PMyiyLkEulz/52KCWqdmr5A=","a8":"eb90079454bca9d7bc97d1946de3ae7f5996f4183e2188df76d4c735","a9":"e28e56adVcbfsKh67Kh6K9/F7V+Pl2XPH/kNwmKBuNORA2YYwbtKfDl5rS+83GkZG0fC7ZFN4i8HPjmLxZybdJdF08AYspkIiQ+5LDcAiNO2/5mDIHjAXtWXn/hONO7ZiybqzGBqdMnskHMf3IJHoRbJtk2Zkbyfx4ibkFr+SFRNhysT1kLsNo8soh6jCLqODXRAQaQfhNU1wIQOwi1RWWPSkgy3W4y3zUdBzSs6ku2MGX/vv51UDkdSWSsUmipuR/RpW07pLirzIRzByHAdTJ9uoqPv/1YItp/9h8XMtMNXdvgCqco2vsFwCw/p04Tt+aEmb289","a10":"2,130","x0":1,"a2":"197ebd952058dd780d9f8873ceae397a"}

在这里插入图片描述

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

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

相关文章

[Python]搭建虚拟环境与项目的创建(Windows)

前言 系列文章目录 [Python]目录 视频及资料和课件 链接&#xff1a;https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd1234 提取码&#xff1a;1234 文章目录前言1. Django 安装2. 为什么要搭建虚拟环境3. 如何搭建虚拟环境3.1 切换Python版本3.2 安装虚拟环境的命令3.3 …

彻底Sparse!基于稀疏交互机制的端到端检测器

摘要&#xff1a; Sparse R-CNN基于R-CNN框架&#xff0c;其提出了一种一对一稀疏交互的机制&#xff0c;同时借鉴了DETR的可学习候选目标的思想&#xff0c;并且结合二分匹配的标签分配策略和集合预测的形式&#xff0c;实现了端到端目标检测的效果&#xff0c;整个过程无需R…

用户运营|车企运筹七条黄金法则,制胜客户体验管理

本文是中国汽车行业客户体验管理(Customer Engagement)和直连直营(DTC)销售模式三部曲系列的首篇。在随后发布的两篇文章中,我们将探讨如何在用户运营中加强客户体验管理,以及如何通过数字化转型实现客户体验管理和DTC。本文是中国汽车行业客户体验管理(Customer Engage…

玛雅Maya2022-2023最新分享

玛雅Maya专业的三维软件玛雅,帮助专业的动画设计师制作出最丰富最动感的动画作品。Maya(2022-2023)最新分享如下: 玛雅Maya2022 玛雅Maya2022是一款专业的三维软件,用于创建逼真的角色和大片水准的特效。无论您是为逼真的数字双精度动画还是为可爱的卡通角色设置动画,Maya …

MySQL--约束

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 1&#xff1a;非空约束 2&#xff1a;唯一性约束 3&#xff1a;主键约束 4&#xff1a;外键约束 在MySQL中是有着约束的&#xff0c;约束是什么呢&#xff0c;约束又…

springboot在线电子书阅读系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT

springboot在线电子书阅读系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT 【用户功能】 用户注册&#xff1a;填写手机账号和密码&#xff0c;注册新用户 登录功能&#xff1a;注册普通账号登录&#xff1b;登录后可以修改用户的基本信息&#xff0c;也可以退出。 …

C语言之长见识了(函数和一些不常见类型)

C1. strstr2. gets3. strlen4. \r\n5. const char * 与 char const *6. size_t、ssize_t、unsigned char、uint8_t6.1 size_t、ssize_t6.2 unsigned char6.3 uint8_t / uint16_t / uint32_t / uint64_t7. memcpy1. strstr 在字符串 haystack 中查找第一次出现字符串 needle 的…

【汽车ECU开发】------INCA使用教程

对于VCU或者是发动机标定工程师&#xff0c;INCA简直是跟亲人一样熟悉&#xff0c;基本上每天都要跟它打交道。分享一波INCA的基本使用操作。其基本的流程如下图所示&#xff1a; 主要操作步骤&#xff0c;打开软件&#xff1a; 点击菜单栏左上角数据库—>新建&#xff0…

TCS34725颜色感应识别模块

TCS34725颜色感应识别模块前言一、模块介绍二、产品参数三、实物图四、模块引脚介绍五、使用说明工作模式的选择上位机界面说明六、实例应用实物接线所用代码前言 TCS34725传感器模块&#xff0c;使用IIC或者UART通信&#xff0c;可直接输出RGB值。 能当做单纯的简单TCS34725模…

Java入门基础知识

Java入门基础知识概念 关键字:具有特殊用途的单词。 保留字:未使用的关键字(goto const)。 直接量:不可用作标识符(ture false null)。 一、JAVA运行机制 Java程序的运行必须经过编写、编译、运行三个步骤。 编写是指在Java开发环境中进行程序代码的输入,最终形成后缀名…

教你如何使用GPA导出模型,另送一个 GPA CSV2MESH Tool in unity

以前写过一篇&#xff1a;Unity - RenderDoc 抓帧导出 FBX&#xff08;带UV&#xff09; 吐槽 我估计GPA是怕收律师函&#xff0c;因为如果 GPA 将所有资源一键提取&#xff0c;一键导出&#xff0c;那么可能很多开发商会告他 可以看到也好几个帖子问 GPA 官方&#xff0c;都…

【PDN仿真笔记3-电容布局Q3D模型搭建】

PDN仿真笔记3-电容布局Q3D模型搭建 1. 叠层参数及设计要求 2. 变量设置 根据设计要求&#xff0c;将各个参数设置为变量&#xff0c;通过Add添加变量名称及数值&#xff08;下图value应该为1.2mil&#xff09; 部分设置完成的变量 3.搭建平面 引用2节中设置的变量&#xf…

检测网络框架越来越多

搬运工又来了 之前也发过相关 在汇总说一下啊~~ yolo也不在孤单了~~ 出了一大堆了~~ 之前都一一发过 今天在来个大汇总 目标检测是现在最热门的研究课题&#xff0c;也一直是工业界重点研究的对象&#xff0c;最近几年内&#xff0c;也出现了各种各样的检测框架&#xff0c…

PHP第三方易宝支付对接

简言&#xff1a; 最近手头有个数字藏品的项目&#xff0c;需要对接第三方易宝支付&#xff0c;在此整理自己的对接经验&#xff0c;希望对大家有所帮助。 步骤 1&#xff0c;下载sdk PHP第三方支付易宝支付最新sdk包&#xff0c;其中包含回调。-PHP文档类资源-CSDN下载 2&…

树形DP

285. 没有上司的舞会 - AcWing题库 题意是给你每个人的开心值&#xff0c;和每个人的顶头上司&#xff0c;如果每个人与自己的顶头上司不会同时去的前提下&#xff0c;问你最大的开心值是多少 树形dp 注释写在代码下面啦~ #include<iostream> #include<cstring>…

ThinkPHP6.0开启多应用模式的方法

ThinkPHP发展至今已经到了6..0.X版本,整个结构较thinkphp5有了很大的变化,ThinkPHP6.0基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规范化。由于引入了一些新特性,ThinkPHP6.0运行环境要求PHP7.1+,不支持5.1的无缝升级(官方给出了升…

3_1 操作系统

3.01 操作系统概述 接口的区分&#xff1a; 人机之间的接口&#xff1a;命令&#xff0c;窗口应用软件与硬件之间的接口&#xff1a;api的接口 进程管理 3.02 进程管理——进程状态转换图 进程的状态&#xff1a;操作系统当中对进程进行管理的时候&#xff0c;为进程指定了几种…

一个项目的整个流程

1.基本配置 基础配置包括 1.Vuex------------作用:存储公共的数据 2.Vue-router---------作用:配置页面的映射关系 3.node_modules--------作用:包的管理工具 npm i 包的名字 4.vue.config.js-----------配置一些信息 例如配置跨域的问题 5.assets 放一些静态的资源…

JAVA毕设项目酒店员工管理系统(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)

JAVA毕设项目酒店员工管理系统&#xff08;VueMybatisMavenMysqlsprnigSpringMVC&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&am…

DoIP协议:通用DoIP首部否定确认码02和03的区别

通用DoIP首部否定确认消息 当外部测试设备(诊断仪)发送DoIP消息给DoIP实体时,DoIP实体的传输层把DoIP消息(传输层payload,即DoIP header + DoIP payload)上发给DoIP协议层。DoIP协议层取到数据后,不管它是什么类型的DoIP消息,首先都需要被DoIP通用首部处理程序按照规定…