吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2230|回复: 114
上一主题 下一主题
收起左侧

[Web逆向] 【JS逆向】某Q音乐VMP纯算

  [复制链接]
跳转到指定楼层
楼主
littlewhite11 发表于 2024-11-19 20:14 回帖奖励
本帖最后由 littlewhite11 于 2024-11-19 20:21 编辑

逆向目标

  • 网址:aHR0cHM6Ly95LnFxLmNvbS8=
  • 目标:歌曲列表查询参数sign

抓包分析

直接在搜索框中搜索某个歌手,会发送一个请求,其中查询参数sign就是我们要逆向的参数。

逆向分析

首先要找到参数生成的位置,我一般的做法是,能搜索就搜索,能hook就hook,实在不行再跟栈。

那就直接全局搜索sign,在某个文件中有三个可疑的地方,把断点都打上,重新发请求(一定要确保请求发出去,不然你会以为不是在这几个断点中生成的),成功断住。

我们要知道的就是i的生成逻辑,调用o函数,传入了请求体。

直接开搞,跟进去,一进去就是一个大的for循环,经常搞VMP的朋友知道,这大概率就是一个VMP了。

搞VMP的一般做法:

  • 将代码拿下来,补足里面缺失的环境,生成关键参数
  • 直接插桩,通过插桩日志分析参数生成的过程
  • 反汇编(很显然,我还没到那个层次)

因为我不会补环境,所以直接插桩分析,我的经验是,假如密文不变的话,那明文能固定就固定(如果存在随机情况如Math.random,时间戳等,可以都hook住),这样分析同一套日志会比较清晰。

既然如此,那我们可以尝试把脚本拿出来单独执行,回到上一层堆栈,发现o的值是n(350).default),经常玩webpack的朋友都知道,n就是加载器,至于webpack怎么逆向,可以自行学习,或者以后有机会再写相关文章。

我们先把请求参数复制下来,便于验证拿下来的代码是不是正确的,记住,密文是这样的。

遇见webpack,关键是要把加载器找到,补齐缺失的模块,然后导出里面相关的函数,这个案例中,可以在控制台输出n,直接进去函数就是加载器了。

本文的重点是VMP,webpack相关的知识就不过多阐述了。

直接在浏览器自定义一个脚本,将相关代码放在里面,导出加密函数,传入之前的明文,生成密文,经过比对,密文是一样的,说明代码没有问题。

那就可以开始插桩了,小板凳准备好,出发!

这种情况下,我会先把明文固定为'1'(个人习惯,毕竟日志多了,不利于分析,有不合理的地方请大佬指出),明文是这样的,zzc84225b7be2qvanbirdlydjus20y7b1urg553b7d79

然后我们就可以下日志断点了,因为脚本是自定义的,直接console.log就好,插桩的话,先从函数调用开始。

麻烦点就是v的变化,这个自己编写一下测试代码就知道怎么回事了。

将所有函数调用逻辑都写好之后,直接输出一次日志,从生成结果开始往上分析。

在分析过程会发现有一个熟悉的密文,这不就是标准的sha1算法吗,这就是我为啥传明文'1'的原因,记住一些标准hash算法的密文就可以不用花时间比对了。

最终结果其实是由四个部分拼接而成的。

zzc: 固定前缀
84225b7: 一个固定索引数组,在sha1密文字符串中取对应的索引进行拼接
be2qvanbirdlydjus20y7b1urg: 通过sha1密文字符串进行一些列运算生成,分析的关键部分
553b7d79: 一个固定索引数组,在sha1密文字符串中取对应的索引进行拼接

关键是第三部分,具体的分析过程就不贴了,读者可以自行解决(我的想法是,自己不搞一遍,技术就不会有提升,过程中需要耐心耐心再耐心)。

提示:在一些位运算中进行插桩,注意某些值可能是固定的,注意大小写。

生成逻辑确定之后,可以直接通过python模拟参数的生成。

模拟请求结果:

成功!!!

免费评分

参与人数 26吾爱币 +28 热心值 +22 收起 理由
jdz888 + 1 + 1 超赞
myfany + 1 谢谢@Thanks!
scz + 1 + 1 谢谢@Thanks!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hualy + 2 + 1 我很赞同!
Machccl + 1 + 1 我很赞同!
soibean + 1 + 1 谢谢@Thanks!
ZbyEMM + 1 + 1 谢谢@Thanks!
kerrychu + 1 + 1 谢谢@Thanks!
wangxiaoqiqiqi + 1 + 1 热心回复!
老道 + 1 谢谢@Thanks!
戮之使 + 1 + 1 谢谢@Thanks!
chao0927 + 1 用心讨论,共获提升!
evalPrivateJS + 1 + 1 我很赞同!
suixing39 + 1 + 1 谢谢@Thanks!
Ignorantlu + 1 + 1 热心回复!
杨辣子 + 1 + 1 谢谢@Thanks!
kidsmiless + 1 + 1 谢谢@Thanks!
lvjiangshan + 1 + 1 技术帖,值得学习
lj0822 + 1 + 1 我很赞同!
prettyafei + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hsmx77 + 1 谢谢@Thanks!
sht281 + 1 + 1 谢谢@Thanks!
HillBoom + 1 + 1 用心讨论,共获提升!
jjyyqwery + 1 + 1 热心回复!
ioyr5995 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
wzl3306241 发表于 2024-11-20 07:08
优秀呀,找了很久
推荐
iamok 发表于 2024-11-20 11:54
littlewhite11 发表于 2024-11-20 10:35
你可以看看其他接口,会有你想要的

我找到js里有个函数返回时打断点确实可以获取到媒体地址,但是js不是很懂,这种不知道该如何去hook。
[JavaScript] 纯文本查看 复制代码
ne = function(){
	function e(){
		......
	}
	......
	,
	e.prototype.getMediaDuration = function(e, t, n, r) {
	    var i, o, a = {
	        mp3: H,
	        m4a: z,
	        mp4: z,
	        ogg: W
	    }, u = null === (o = null === (i = e.match(/\.([a-zA-Z0-9]+)(\?|$)/)) || void 0 === i ? void 0 : i[1]) || void 0 === o ? void 0 : o.toLocaleLowerCase();
	    return u && a[u] ? a[u](t, !!["mp3", "ogg"].includes(u) && n, "ogg" === u ? r : void 0).duration : 0
	}
}()
沙发
deffedyy 发表于 2024-11-19 23:42
3#
JerryGod 发表于 2024-11-20 00:20
感谢楼主,学会了,有空试试
4#
qa369360 发表于 2024-11-20 00:49
厉害了,我的哥
5#
grayad 发表于 2024-11-20 01:04
好好好,好一个经常玩xxx的朋友。。。
6#
zhh199234 发表于 2024-11-20 01:07
感谢分享
7#
、神通广大 发表于 2024-11-20 01:09
感谢分享
8#
asmprofan 发表于 2024-11-20 06:03

感谢分享
9#
70后社工 发表于 2024-11-20 06:04
感谢楼主,有空试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 10:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表