吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 87|回复: 0
上一主题 下一主题
收起左侧

[Web逆向] 某音乐jsvmp插桩纯算解析+响应数据加密绕过

[复制链接]
跳转到指定楼层
楼主
dfbdy 发表于 2026-3-15 22:12 回帖奖励
本帖最后由 dfbdy 于 2026-3-16 17:58 编辑

​声明
       本文章所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则,由此产生的一切后果均与作者无关,若有侵权,请联系作者立即删除!
背景与目标
  • JSVMP是一种基于JavaScript虚拟机层的保护技术,利用自定义的虚拟机指令集和解释执行机制,将原始JS代码转译为虚拟机字节码,增加代码的复杂度和不可读性,从而防止被直接逆向。
  • JSVMP逆向一般可以补环境、插桩使用算法还原、或者使用AST还原jsvmp代码等。本篇vmp较为简单,这里我们使用插桩算法还原。
  • 逆向目标:纯算法还原、加密参数生成、响应数据加密绕过
  • 拓展:表单数据解密
接口分析
        首先我们进入网站,打开开发者工具进行抓包,可以看到如下内容,接口不止一个,是因为我们打开的是评论,我大概看了一下一个接口里有25条评论,我们随便选一个来看。响应数据明显被加密了,先不管响应数据,能拿到数据之后,后面再解密。我们来看一下有哪些加密参数

        我们可以看到 _ 明显是时间戳,‘encoding:ag-1’是个固定参数,这个参数也比较关键,放到后面讲。现在看来需要逆向的有sign和下面这一大串字符,你们也可以复制两个比较一下,会变的参数就这几个。

        这里我们先来寻找sign,这里可以直接搜索到,就不细讲了,直接上图。可以看到c是由 P(r.data)返回的,r.data是一串字符,根据不同字符返回不同内容,这里我们想要的是评论,r.data = "{"comm":{"cv":4747474,"ct...6688"}}}"。我们进到P函数里面去

        可以看到明显是jsvmp,这里我们将需要的代码拿下来放到代码段里面分析

        随便传入一个值看看返回结果


        好,到此sign的加密函数已经出来了,接下来我们进行核心步骤----插桩
插桩分析
        插桩前我们先看一下,这里有i和a两个函数具体走哪一个或者是都走了,可以打断点进去看一下,是走了i里面的,所以我们只需要在i里面插桩就可以了。

插桩1.0(先插函数调用如 .call .apply,观察大致逻辑)
        插桩有很多方法,如打印日志(代码多容易卡死);定义一个列表,将日志信息push到列表里面;我们直接使用如下方法。

        将所有的call和apply插桩后,先运行代码分析一下日志,从上往下看,这里对我们传的参数进行了加密,加密结果长度是四十,大概就是SHA-1加密,验证发现就是SHA-1。接着再往日志下面看

        从上到下依次定为res1,res2,res3观察一下可以发现结果就是'zzc'+str1+str3+str2z这样拼接而来的。
        先看res1和res2,res1是由[23, 14, 6, 36, 16, 40, 7, 19]数组进行操作得到另一个数组在进行拼接而来,res2也是一样的操作,多传几个不同的值会发现,[23, 14, 6, 36, 16, 40, 7, 19]和[16, 1, 32, 12, 19, 27, 8, 5] 两个数组是固定的。 具体数组的操作是        'SHA-1加密后的字符串'.charAt(数组中每个值)==> 字符 ==>字符再拼接 ==> 结果。
        res1,res2,都是这样得到的。res3怎么来的呢,直接上代码
btoa(String.fromCharCode(...[69, 65, 132, 62, 40, 179, 205, 162, 183, 203, 35, 255, 241, 13, 153, 84, 229, 155, 79, 26])) ==> 'RUGEPiizzaK3yyP/8Q2ZVOWbTxo='再把特殊字符替换为空就行了。
        现在我们已知res1,res2数组,还缺一个res3的数组,从目前的信息中看不出来,那么就再插桩。

插桩2.0(再插运算符,深析内部结构)

        像这样把所有运算符操作的代码插上,再运行代码观察日志。这里是他前两组的算法逻辑,大概看一下就知道怎么回事了

(index)*2-->res1
a*16-->res2
(index)*2-->res3
res1+1-->res4
res2+b-->res5
res5^c-->result,这里是整理好的逻辑,index就是索引,在这里面一共循环了二十次,刚好生成二十个值,还有a,b,c不知道哪里来的,接下来我们再次插桩。
插桩3.0(最后再插赋值操作)
        最后就是这种赋值操作了,插完之后,定位到相同位置

        字典{ "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}和列表[89, 39, 179, 150, 218, 82, 58, 252, 177, 52, 186, 123, 120, 64, 242, 133, 143, 161, 121, 179]都是固定的,a,b,c都是从这里面取的,也比较简单。
        至此sign里的所有参数都已经出来了。我们接下来有两条路可走,第一继续分析表单数据(也是个vmp)然后对密文进行解密;第二直接绕过加密。我们先来讲绕过加密,表单数据解密放到最后讲。响应数据加密的绕过
        首先让我们来看一下以往的载荷,表单数据是没有被加密的,也没有我上面提到的‘encoding:ag-1’参数,实际上这个‘encoding:ag-1’参数是一个加密标志,当带上这个参数提交时,则会调用加密函数对响应数据进行加密,我们只需要把这个参数删去,然后表单数据使用明文即可绕过。

废话不多说我们直接上代码


OK,成功出值!
如果对表单数据解密感兴趣的还可以继续往下看
解密表单数据
        表单数据的加密入口就在这个L()函数里面,然后继续把加密函数拿下来,再插桩和sign的操作一模一样,这里就不讲了。

        插完桩让我们来分析一下日志,这里我们就只看这个1280长度的数组,难点就在这个里面,得到这个数组之后还是找规律,自己看看就能出来。

        这里往上看找到第一个1252数组生成的地方,这里是依据我们传进来的明文表单数据通过charCodeAt()返回指定位置的字符的 Unicode 编码,得到这个1252长度的数组

        接着我们往下看,这是个AES-GCM加密,对1252长度的数组进行了加密,但是返回了一个长度为1268的数组,我们先找到 iv 和 key 。
        往上翻可以看到这个函数getRandomValues(),是用于生成加密强度的随机数。iv就是由这个随机生成的
        key往上翻也能看到,实际上key就是[189, 48, 95, 16, 208, 255, 116, 182, 239, 84, 218, 184, 53, 181, 225, 207]数组是不变的

        好了现在 iv 和 key 都有了,但是使用AES-GCM对长度为1252的数组加密后长度还是1252,缺了16位,一开始想的是与这个 key 有关,因为 key 也是16位,但是怎么加都不对。这个地方也是卡了我一个下午,后来深入了解AES-GCM后发现,这个加密方法会返回 IV + 密文 + 认证标签 (AES-GCM标准格式)这种格式前面一直没有把认证标签加上,加上认证信息刚好1268位。
        在最后只需要把生成的 iv 拼接在1268位数组前面,就得到了1280位数组了。
总结
        本文深入探讨了关于某音乐平台中的 JSVMP 插桩技术和响应数据加密绕过的技术细节。​

0d8610fff4a24c82b20dbffdf55b188c.png (83.47 KB, 下载次数: 0)

0d8610fff4a24c82b20dbffdf55b188c.png

4abe06fb3dc84443b5cd21e1ec12214b.png (15.66 KB, 下载次数: 0)

4abe06fb3dc84443b5cd21e1ec12214b.png

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

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-3-18 02:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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