qq音乐sign逆向

server/2024/11/14 11:52:09/

qq音乐sign参数逆向


1.概览

image-20240529110411618

参数sign长度40

多次调试发现,前缀zzb不变

2.打日志

跟站发现是vpm,在apply调用打上日志断点:

image-20240529110644850

连蒙带猜知道,最终字符串四部分构成,zzb 24DC2798 HI0TvE4tOMqzN4w88oZCjQ EE0A88FE

1.把请求的body参数直接MD5得到c8a043f88d8e9b012eeb72673ec92a8b
2.利用固定数组[21, 4, 9, 26, 16, 20, 27, 30]和上面结果,使用charat得到字符串:24DC2798EE0A88FE
3.中间的HI0TvE4tOMqzN4w88oZCjQ,我们分析这个

HI0TvE4tOMqzN4w88oZCjQ来源:

把vmp的栈打印,在位运算的地方打上日志点:

发现两个固定东西:

    let fmap = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"A":10,"B":11,"C":12,"D":13,"E":14,"F":15}let arr  = [212,45,80,68,195,163,163,203,157,220,254,91,204,79,104,6];

需要参与运算,运算日志如下:

E1EFCB705902FAD5BFD7F8C3CA904EF0   ->data的md5值
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:54 '-' 38 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 14 '*' 16 '=>' 224
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '*' 2 '=>' 0
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '+' 1 '=>' 1
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 224 '+' 1 '=>' 225
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 225 '^' 212 '=>' 53
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> [] args-> [53]vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '+' 1 '=>' 1
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '|' 0 '=>' 0
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 19 '-' 3 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 1 '*' 2 '=>' 2vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 54 '-' 38 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 14 '*' 16 '=>' 224
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 1 '*' 2 '=>' 2
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 2 '+' 1 '=>' 3
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 224 '+' 15 '=>' 239
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 239 '^' 45 '=>' 194
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> [53] args-> [194]vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 1 '+' 1 '=>' 2
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '|' 1 '=>' 1
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 19 '-' 3 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 2 '*' 2 '=>' 4vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 54 '-' 38 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 12 '*' 16 '=>' 192
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 2 '*' 2 '=>' 4
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 4 '+' 1 '=>' 5
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 192 '+' 11 '=>' 203
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 203 '^' 80 '=>' 155
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> (2) [53, 194] args-> [155]
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 2 '+' 1 '=>' 3
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '|' 2 '=>' 2
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 19 '-' 3 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 3 '*' 2 '=>' 6vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 54 '-' 38 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 7 '*' 16 '=>' 112
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 3 '*' 2 '=>' 6
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 6 '+' 1 '=>' 7
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 112 '+' 0 '=>' 112
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 112 '^' 68 '=>' 52
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> (3) [53, 194, 155] args-> [52]

可以发现,

第0组:

vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:14 '*' 16 '=>' 224
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '*' 2 '=>' 0
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 0 '+' 1 '=>' 1
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 224 '+' 1 '=>' 225
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 225 '^' 212 '=>' 53

我们记let md5v = E1EFCB705902FAD5BFD7F8C3CA904EF0

16是每组都一样的固定值:

14是fmap[md5v[0]]

1是fmap[md5v[0+1]]

212是arr[0]


第1组:

vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 54 '-' 38 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 14 '*' 16 '=>' 224
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 1 '*' 2 '=>' 2
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 2 '+' 1 '=>' 3
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 224 '+' 15 '=>' 239
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 239 '^' 45 '=>' 194
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> [53] args-> [194]

我们记let md5v = E1EFCB705902FAD5BFD7F8C3CA904EF0

16是每组都一样的固定值:

14是fmap[md5v[2]]

15是fmap[md5v[2+1]]

45是arr[1]


第2组:

vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 54 '-' 38 '=>' 16
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 12 '*' 16 '=>' 192
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 2 '*' 2 '=>' 4
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 4 '+' 1 '=>' 5
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 192 '+' 11 '=>' 203
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 203 '^' 80 '=>' 155
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> (2) [53, 194] args-> [155]

我们记let md5v = E1EFCB705902FAD5BFD7F8C3CA904EF0

16是每组都一样的固定值:

12是fmap[md5v[4]]

11是fmap[md5v[4+1]]

80是arr[2]


第3组:

vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 7 '*' 16 '=>' 112
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 3 '*' 2 '=>' 6
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 6 '+' 1 '=>' 7
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 112 '+' 0 '=>' 112
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 112 '^' 68 '=>' 52
vendor.chunk.b71d8ba4d37617cb2e8d.js?max_age=2592000:1 this-> (3) [53, 194, 155] args-> [52]

我们记let md5v = E1EFCB705902FAD5BFD7F8C3CA904EF0

16是每组都一样的固定值:

7是fmap[md5v[6]]

0是fmap[md5v[6+1]]

68是arr[3]


那么,第i组:

(fmap[md5v[i*2]] * 16 + fmap[md5v[i*2+1]]) ^ arr[i]

js代码为:

function get_arr_16(str32){let ans = [];let fmap = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"A":10,"B":11,"C":12,"D":13,"E":14,"F":15}let arr  = [212,45,80,68,195,163,163,203,157,220,254,91,204,79,104,6];for (let i = 0; i < 16; i++) {ans.push((fmap[str32[i*2]]*16 + fmap[str32[i*2+1]])^arr[i])}console.log(ans)return ans;
}

综上所有逻辑结束。

3.验证:

image-20240529114622246

http://www.ppmy.cn/server/44937.html

相关文章

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…

慧尔智联携纷享销客启动CRM项目 推进客户经营升级与内外高效协作

智慧农业领军企业慧尔智联携手纷享销客&#xff0c;启动CRM客户经营管理系统项目。双方将深入合作&#xff0c;全面落实慧尔智联发展策略&#xff0c;持续提升数字化经营管理水平&#xff0c;实现内部团队信息化高效协作&#xff0c;以快速响应市场需求&#xff0c;提升客户满意…

【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化+完美使用

模版介绍 【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化完美使用 腾讯官方出品discuz论坛DIY的后台设置&#xff0c;功能齐全&#xff0c;论坛功能不亚于葫芦侠&#xff0c;自定义马甲&#xff0c;自定义认证&#xff0c;自定义广告&#xff0c;完全可以打造出自己想…

vue el-carousel走马灯实现显示多张(5张)和(7张)

vue el-carousel走马灯实现显示多张&#xff08;5张&#xff09;和&#xff08;7张&#xff09; 父组件不用修改&#xff0c;仅在子组件源码的基础上进行修改即可 直接上代码 <template><div><el-carousel v-if"typeitem5_xybjzq || typeitem5_qdbjzq&quo…

LeetCode - 双指针(Two Pointers) 算法集合 [对撞指针、快慢指针、滑动窗口、双链遍历]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139270999 双指针算法是一种常见且灵活的技巧&#xff0c;通过使用两个指针协同完成任务。这些指针可以指向不同的元素&#xff0c;具体应用取决于…

linux清理僵尸进程

1、僵尸进程是什么&#xff1f; 僵尸进程是当子进程比父进程先结束&#xff0c;而父进程又没有回收子进程&#xff0c;释放子进程占用的资源&#xff0c;此时子进程将成为一个僵尸进程。如果父进程先退出 &#xff0c;子进程被init接管&#xff0c;子进程退出后init会回收其占…

单值二叉树(oJ题)

一、题目连接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二、题目思路 遍历左右子树&#xff0c;如果左子树存在不为空并且根结点的值不等于左子树的值&#xff0c;返回false, 如果右子树存在不为空并且根结点的值不等于右子树的值&#xff0c;返回false, 每一个…

20、设计模式之备忘录模式

备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。备忘录模式属于行为型模式。 介绍 意图&#xff1a; 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存…