接口:
aHR0cHM6Ly91Ni55LnFxLmNvbS9jZ2ktYmluL211c2ljcy5mY2c/Xz0xNzI3MjE1MzgyOTcxJnNpZ249enpjYjA4NmYwNG5yaDZmaTlkZnJlcWFxbm4xZHc3MWgxYWZjMzI0ZGY5
听说QQ音乐更新了新的jsvmp搞一哈,腾讯的jsvmp真挺恶心
正题开始
入口
进去是一个
vender.chunk的js文件
推荐插装位置
'case',n[g+1],'d-->',d
case:78
观察日志如下 可以发现四部分组成
zzc+7F8BDB4+xRwSHWDuKAhpwPbMUqGteWOfyeo+DCE141B1
其中zzc是固定的头
第二段 第四段分析如下
可以看出都是通过数组对'9C3BA18BBABC12F4D8F44CB72AE15FFCEC3EB059'进行取值拿到
数组分别是
arr1 = [16, 1, 32, 12, 19, 27, 8, 5]
arr2 = [23, 14, 6, 36, 16, 40, 7, 19]
那就需要对
'9C3BA18BBABC12F4D8F44CB72AE15FFCEC3EB059'进行分析 长度40位,猜测SHA1
观察算法
分析一般需要明文
{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":"1152921504688679048","g_tk_new_20200303":1543615683,"g_tk":1543615683},"req_1":{"module":"userInfo.VipQueryServer","method":"SRFVipQuery_V2","param":{"uin_list":["1152921504688679048"]}},"req_2":{"module":"userInfo.BaseUserInfoServer","method":"get_user_baseinfo_v2","param":{"vec_uin":["1152921504688679048"]}},"req_3":{"module":"music.lvz.VipIconUiShowSvr","method":"GetVipIconUiV2","param":{"PID":3}},"req_4":{"module":"music.musicasset.SongFavRead","method":"IsSongFanByMid","param":{"v_songMid":["004aJoYT3ia7al","003HSdVY3Z3GST","0017K7gL4WYnw2","0004zcfr0neC9O","00435Bsb3ulbB1","0022b7OX2STU86","0045FboO0aaIiC","003XT6Ef4H6X66","002bAj9d3gNu5G","004By6jG26HcCm"]}},"req_5":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"004aJoYT3ia7al","songID":1030353}},"req_6":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"1030353","biz_sub_type":0}]}},"req_7":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"001aC9dM35U6KB"}},"req_8":{"module":"music.vkey.GetVkey","method":"GetUrl","param":{"guid":"8534347273","songmid":["004aJoYT3ia7al"],"songtype":[0],"uin":"1152921504688679048","loginflag":1,"platform":"20","filename":["RS020618fmVD1qUD6L.mp3"]}}}
测试一下sha1
现在三段已经解决了分析最麻烦第三段
通过在switch的日志 会有大概12W条 可以看到生成的位置应该打在case21 处开始加密
然后我选择先在case 78 插装 等到了 要进行的加密的时候 再打开swicth 慢慢跟一下可以减少看log的负担
这是在算法过程中一段日志 来分析一下
首先可以看到
他是2的倍数每次两个
通过日志可以看到 对上一步的字符串取了index是22的’5‘
然后5*16 = 80
回到22
进行自加1操作
得到 23然后又从字符串取了index为23的5 然后把一开始的80和5 相加得到85
接下来从一个20位的固定数组取了index为11的123
然后做异或得到
再把46存到数组里 这就是里面算法的过程
为了更深一步的说明 我们在仔细看一下里面有一个{0:0,1:1,2:2......}这个是干啥用的
跟栈就好了下面拿日志举例子
可以发现{0:0,1:1,2:2......} 的作用其实就是 通过映射表找到对应的字母所对应的数字0-15
然后又取了字符串的第25位”0“
然后就是176+0 = 176 存入数组
这个过程其实和JavaScript中的parseInt("B0",16) 进制一样 总的来说就是每次取俩个值然后转成16进制: B:12 11*16= 176 ; 0:0 0*1=0 176+0 = 176
最后拿到数组后进行base64操作
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
xRwSHWDuKAhpwPbMUqGteWOfyeo=
删掉 =
将上面的拼接得到
'zzc7F8BDB4xRwSHWDuKAhpwPbMUqGteWOfyeoDCE141B1'
最终的结果是
'zzc7f8bdb4xrwshwdukahpwpbmuqgtewofyeodce141b1'
所以需要最终的结果是需要转小写
zzc7f8bdb4xrwshwdukahpwpbmuqgtewofyeodce141b1
完结
如有问题请联系