xx音乐app逆向分析

目标

在这里插入图片描述

看一下评论的请求
在这里插入图片描述

抓包

这里使用httpcanary
请求包如下

POST /index.php?r=commentsv2/getCommentWithLike&code=ca53b96fe5a1d9c22d71c8f522ef7c4f&childrenid=collection_3_1069003079_330_0&kugouid=1959585341&ver=10&clienttoken=7123ecc548ec46d37574673793de1c825d9c213736a85283bf4517c71bfdcd90&appid=1005&clientver=10659&mid=255834326356876873930945227799988288305&clienttime=1693566637&key=7b098bdd24e31575d6977ddbd52c619e&uuid=e09ba4f899c6777225b76388a44e41bb&dfid=1tT6n21DUstm011Xnf3a0Llw&gitversion=45ced73&p=1&pagesize=20&show_admin_tags=1 h2
Host: gateway.kugou.com
user-agent: Android810-AndroidPhone-10659-14-0-COMMENT-wifi
kg-thash: 4fc50f7
accept-encoding: gzip, deflate
kg-rc: 1
kg-fake: 1959585341
kg-rf: 009831c9
x-router: m.comment.service.kugou.com
content-length: 0

参数分析

首先看看变化的参数

v1 = "commentsv2/getCommentWithLike&code=ca53b96fe5a1d9c22d71c8f522ef7c4f&childrenid=collection_3_1985146619_68_0&kugouid=1959585341&ver=10&clienttoken=7123ecc548ec46d37574673793de1c82ef5ff5dbe19e27c1f1dd496ef8068914&appid=1005&clientver=10659&mid=334457935609434160207438033358774315577&clienttime=1693573528&key=b697376d876fc22548b636ae3e5ffac6&uuid=289a2994c5d812303781a7f2af74531e&dfid=348EFn2ifiKQ3hFGWR2tVCd9&gitversion=45ced73&p=1&pagesize=20&show_admin_tags=1".split("&")v2 = "commentsv2/getCommentWithLike&code=ca53b96fe5a1d9c22d71c8f522ef7c4f&childrenid=collection_3_1985146619_68_0&kugouid=1959585341&ver=10&clienttoken=7123ecc548ec46d37574673793de1c82ef5ff5dbe19e27c1f1dd496ef8068914&appid=1005&clientver=10659&mid=334457935609434160207438033358774315577&clienttime=1693573554&key=0ee5e09a8270eb43a057de167465b166&uuid=289a2994c5d812303781a7f2af74531e&dfid=348EFn2ifiKQ3hFGWR2tVCd9&gitversion=45ced73&p=1&pagesize=20&show_admin_tags=1".split("&")
for a,b in zip(v1, v2):if a == b:continueelse:print(a, b)

结果如下

clienttime=1693573528 clienttime=1693573554
key=b697376d876fc22548b636ae3e5ffac6 key=0ee5e09a8270eb43a057de167465b166

clienttime是时间戳,那么只要知道key是怎么来的就行了

反编译apk

直接用jadx反编译,使用最新版本的可以不用内存大小。
接着就要看看是不是在java层。首先搜索show_admin_tags试试。
在这里插入图片描述
非常好就一处。

public String m() {StringBuffer a2 = o.a("", b(), a(), this.f9765a, "", "", true, f());if (!TextUtils.isEmpty(this.f9766b)) {a2.append("extdata=");a2.append(this.f9766b);a2.append(ContainerUtils.FIELD_DELIMITER);}if (e() == 1) {a2.append("tid=");a2.append(this.f9769e);a2.append(ContainerUtils.FIELD_DELIMITER);}a(a2);a2.append("p=");a2.append(this.f9767c);a2.append(ContainerUtils.FIELD_DELIMITER);if (this.f9768d > 0) {a2.append("pagesize=");a2.append(this.f9768d);a2.append(ContainerUtils.FIELD_DELIMITER);}if (this.i > 0) {a2.append("mixsongid=");a2.append(this.i);a2.append(ContainerUtils.FIELD_DELIMITER);}if (!TextUtils.isEmpty(this.n)) {a2.append("ex_cmtid");a2.append(ContainerUtils.KEY_VALUE_DELIMITER);a2.append(this.n);a2.append(ContainerUtils.FIELD_DELIMITER);}if (!TextUtils.isEmpty(this.j)) {a2.append("cmtreturnserver");a2.append(ContainerUtils.KEY_VALUE_DELIMITER);a2.append(i());a2.append(ContainerUtils.FIELD_DELIMITER);}if (!TextUtils.isEmpty(this.k)) {a2.append("cmtdreturnserver");a2.append(ContainerUtils.KEY_VALUE_DELIMITER);a2.append(j());a2.append(ContainerUtils.FIELD_DELIMITER);}if ("ca53b96fe5a1d9c22d71c8f522ef7c4f".equals(a())) {a2.append("show_admin_tags");a2.append(ContainerUtils.KEY_VALUE_DELIMITER);a2.append("1");a2.append(ContainerUtils.FIELD_DELIMITER);}Long g = g();if (g != null) {a2.append("user_id=");a2.append(g);a2.append(ContainerUtils.FIELD_DELIMITER);}String l = l();if (!TextUtils.isEmpty(l)) {a2.append("godk=");a2.append(l);a2.append(ContainerUtils.FIELD_DELIMITER);}if (!TextUtils.isEmpty(this.l)) {a2.append("session=");a2.append(by.b(this.l));a2.append(ContainerUtils.FIELD_DELIMITER);}if (this.q) {a2.append("show_weightlist=1&");}if (this.r) {a2.append("show_replys=1&");}if (!TextUtils.isEmpty(this.f9770f)) {a2.append(this.f9770f);}return o.a(a2);}

先来hook一下试试m方法。

function my_g(){let g = Java.use("com.kugou.android.app.common.comment.b.g");g["m"].implementation = function () {console.log('m is called');let ret = this.m();console.log('m ret value is ' + ret);return ret;};}
# m is called
# m ret value is r=commentsv2/getCommentWithLike&code=ca53b96fe5a1d9c22d71c8f522ef7c4f&childrenid=collection_3_1985146619_68_0&kugouid=1959585341&ver=10&clienttoken=7123ecc548ec46d37574673793de1c82ef5ff5dbe19e27c1f1dd496ef8068914&appid=1005&clientver=10659&mid=334457935609434160207438033358774315577&clienttime=1693573528&key=b697376d876fc22548b636ae3e5ffac6&uuid=289a2994c5d812303781a7f2af74531e&dfid=348EFn2ifiKQ3hFGWR2tVCd9&gitversion=45ced73&p=1&pagesize=20&show_admin_tags=1

确实如此,但m函数代码里并没有出现key, 所以看看StringBuffer a2 = o.a(“”, b(), a(), this.f9765a, “”, “”, true, f());
跟一下就知道了。
在这里插入图片描述

key的加密方式

在这里插入图片描述
是md5,如何确定参数呢
贴一下hook代码比对下参数就行了

# -*- coding: utf-8 -*-
# @Time    : 27/8/2023 下午 1:32
# @Author  : 明月清风我
# @File    : main.py
# @Software: PyCharm
import frida, sys
import os
import reos.system("adb forward tcp:27042 tcp:27042")
os.system("adb forward tcp:27043 tcp:27043")def on_message(message, data):if message['type'] == 'send':print("[*] {0}".format(message['payload']))else:print(message)rdev = frida.get_remote_device()
front_app = rdev.get_frontmost_application()
print(front_app)
pid = re.findall(r'pid=(\d+)', str(front_app))[0]
jscode_hook = """console.log("Enter the Script!");function my_g(){let g = Java.use("com.kugou.android.app.common.comment.b.g");g["m"].implementation = function () {console.log('m is called');let ret = this.m();console.log('m ret value is ' + ret);return ret;};}function my_a(){let o = Java.use("com.kugou.android.app.common.comment.b.o");let ba = Java.use("com.kugou.common.utils.ba");ba["a"].overload('java.lang.String').implementation = function (str) {console.log('a is called' + ', ' + 'str: ' + str);let ret = this.a(str);console.log('a ret value is ' + ret);return ret;};}function br_a(){let br = Java.use("com.kugou.common.utils.br");br["a"].overload('[Ljava.lang.Object;').implementation = function (objArr) {console.log('br_a is called' + ', ' + 'objArr: ' + objArr);let ret = this.a(objArr);console.log('br_a ret value is ' + ret);return ret;};}Java.perform(function () {my_a();br_a();my_g();});"""
process = frida.get_usb_device().attach(int(pid))
script = process.create_script(jscode_hook)
script.on('message', on_message)
print('[*] Hook Start Running')
script.load()
sys.stdin.read()

在这里插入图片描述
对于同一首歌曲只会改变clienttime

python复现

import hashlib
import time
import requestsdef hash_md5(s):return hashlib.md5(s.encode()).hexdigest()
timeStamp = str(int(time.time()))s = "1005OIlwieks28dk2k092lksi2UIkp10659{}334457935609434160207438033358774315577".format(timeStamp)
key = hash_md5(s)url = "https://gateway.kugou.com/index.php?r=commentsv2/getCommentWithLike&code=ca53b96fe5a1d9c22d71c8f522ef7c4f&childrenid=collection_3_1069003079_330_0&kugouid=1959585341&ver=10&clienttoken=7123ecc548ec46d37574673793de1c825d9c213736a85283bf4517c71bfdcd90&appid=1005&clientver=10659&mid=255834326356876873930945227799988288305&clienttime=1693566637&key={}&uuid=e09ba4f899c6777225b76388a44e41bb&dfid=1tT6n21DUstm011Xnf3a0Llw&gitversion=45ced73&p=1&pagesize=20&show_admin_tags=1".format(key)
headers = {"Host": "gateway.kugou.com","user-agent": "Android810-AndroidPhone-10659-14-0-COMMENT-wifi","x-router": "m.comment.service.kugou.com"
}
response = requests.post(url, headers=headers).text
print(response)

在这里插入图片描述

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

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

相关文章

vs2008下的mfc hello world实现

笔者不知道会写这种博文,好久没写mfc程序,hello world都不会创建了。起因是来了个mfc任务,那就得把mfc熟悉起来,先看下实现效果吧 因为是基于2008的,那就按照2008创建吧 文章目录 第一步:文件新建项目第二…

【iOS】折叠cell

文章目录 前言一、实现效果二、折叠cell的实现原理三、实现折叠cell的高度变化四、实现选中点击的单元格总结 前言 在暑假的3GShare中用到了折叠cell控件,特此总结博客记录 一、实现效果 二、折叠cell的实现原理 首先我们需要知道ScrollView的是TableView的父类&a…

Gitee注册和使用

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.Gitee 1.1Gitee是什么 1.2Gitee的注册以及远程仓库的创建…

ClickHouse 使用

CREATE DATABASE test on cluster ck_00_1repl; DROP TABLE local_t_ordt_order on cluster ck_00_1repl; 创建本地 local 表 CREATE TABLE test.local_order_db_t_order on cluster ck_00_1repl ( forder_id_hash String, forder_id String, fuid Int32, forder_type Int32…

下面是实践百度飞桨上面的pm2.5分类项目_logistic regression相关

part1:数据的引入,和前一个linear regression基本是一样 part2:数据解析——也就是数据的“规格化” 首先,打算用dataMat[]和labelMat[]数据存储feature和label,并且文件变量fr 然后,是这个for line in fr.readlines()循环&#…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——形式逻辑——联言选言假言——等价

角度 角度——汇总 性质 (1) 有的 S 是 P 有的 S → P ;换位:有的 S 是 P 有的 P 是 S ;不可逆否 有的S是P有的S→P;换位:有的S是P有的P是S;不可逆否 有的S是P有的S→P&#xff1…

Android AGP8.1.0组件化初探

Android AGP8.1.0组件化初探 前言: 前面两篇完成了从AGP4.2到 AGP8.1.0的升级,本文是由于有哥们留言说在AGP8.0中使用ARouter组件化有问题,于是趁休息时间尝试了一下,写了几个demo,发现都没有问题,跳转和传…

【docker】容器的运行、停止、查看等基本操作

容器与镜像的区别 image镜像 Docker image是一个read-only文件,位于磁盘上这个文件包含文件系统,源码,库文件,依赖,工具等一些运行application所需要的文件可以理解成一个模板docker image具有分层的概念 container…

3D路径,控件

1控件拖入画板: 2属性配置: 1轨迹颜色 2 3 4

AI建模 | 物体三维重建的高效方法

三维重建是将客观世界中的物体在虚拟空间表达出来,在大众视野中,物品三维重建最直观的应用当属虚拟仿真和VR/AR导航。其实在学科专业领域,三维重建已经更早地应用在高精地图、测绘系统、城市规划等领域。 科技发展的终极方向应当是普适性&am…

R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例...

原文链接:http://tecdat.cn/?p23426 混合线性模型,又名多层线性模型(Hierarchical linear model)。它比较适合处理嵌套设计(nested)的实验和调查研究数据(点击文末“阅读原文”获取完整代码数据)。 相关视频 序言 此外&#xff0…

uniapp 配置并使用 VueX

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 VueX 1、创建需要的文件 右键点击 根目录【我的是 uni-shop】,然后新建 目录&a…

华为云云服务器评测|华为云云耀云服务器L实例使用教学

文章目录 教学小故事 教学 华为云云耀云服务器L实例是一款提供高效、可靠、安全的基础设施服务的云服务器。下面是使用教学: 登录华为云官网。 测评产品链接:https://www.huaweicloud.com/product/hecs-light.html 进入云耀云服务器管理控制台&#xf…

go语言--锁

锁的基础,go的锁是构建在原子操作和信号锁之上的 原子锁 原子包实现协程的对同一个数据的操作,可以实现原子操作,只能用于简单变量的简单操作,可以把多个操作变成一个操作 sema锁 也叫信号量锁/信号锁 核心是一个uint32值&#…

【Vue3】组件递归

【Vue3】组件递归 实现效果 通过传入一个数字&#xff0c;实现数字次循环 父组件 <script setup> import { ref } from "vue"; import RecursionMe from "./components/RecursionMe/index.vue";const level ref(0);const add () > level.val…

RocketMQ入门

安装 官网 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 下载 https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-source-release.zip 解压后上传 启动NameServer 修改runserver.sh&#xff0c;分配内存如果比系统高会导致启动…

【MySQL】基础语法总结

MySQL 基础语句 一、DDL 数据库定义语言 1.1CREATE 创建 1.1.1 创建数据库 语法结构 CREATE DATABASE database_name;示例 CREATE DATABASE demo;1.1.2 创建表 语法结构 CREATE TABLE 表名 (列1 数据类型,列2 数据类型,... );示例 CREATE TABLE new_user (id INT PRIMARY KE…

Apifox-比postman更优秀的接口自动化测试平台

一、Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好 API 文档&#xff0c;API 调试、API 数据 Mock、AP…

画流程图都可以用哪些工具?

在日常生活中&#xff0c;我相信我们很多人都看到过流程图。对于设计师来说&#xff0c;它还需要涉及流程图来反映用户的旅程和交互方式。那么你知道哪些流行的流程图设计软件呢&#xff1f;作为高级设计师&#xff0c;我今天推荐10款流程图设计软件。你可以和我一起读这篇文章…

DEAP库文档教程三-----创建类型

本节将继续展示如何通过creator创建类型以及如何使用toolbox如何对复杂问题进行初始化。 Particle的初始化--粒子初始化 一个Particle是另一个特殊类型的个体&#xff0c;这是因为通常情况下它有一个速度&#xff0c;并且有一个最优的位置需要去记忆。这种类型个体的创建与通…