吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

[Web逆向] 某讯jsvmp(二)

[复制链接]
跳转到指定楼层
楼主
dddd0526 发表于 2026-1-12 16:49 回帖奖励
本帖最后由 dddd0526 于 2026-1-12 17:07 编辑

前言


文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口均已做脱敏处理。严正声明禁止用于商业和非法用途,否则由此产生的一切后果与作者本人无关。


  • 站点:某讯jsvmp(二)
  • 加密点:滑块参数(collect)
  • 网址aHR0cHM6Ly9hY2NvdW50cy5kb3ViYW4uY29tL3Bhc3Nwb3J0L2xvZ2lu
接着上一篇文章继续聊
  • 先简单看下打印出来的日志(此时只打印了函数调用位置),我们先从下网上看,最终结果是replace()方法传入一个正则/\+|\/|=/g后返回的。

  • 我们在往上看日志

  • 这里可以看到,btoa() 方法不在赘述,将一段乱码字符串,经过b64编码得到加密参数,这个b64是标准的,并没有魔改。并且这个加密参数在最终结果的末尾位置。
  • 看日志到现在,其实我们应该有俩个方向:
  • 1.这个乱码字符串是怎么来的?
  • 2.这个加密参数会不会是多段拼接起来的?
  • 带着这俩个疑问(参考方向)继续向上看日志。

  • 看样子非常符合我们的猜测,同样的btoa方法,返回值与我们的结果也一致。我们继续想上找,看下经过了几次相加拼接成的结果。

  • 到这儿肯定有大佬们要说了,刚刚下面不是已经到tm4了嘛,怎么这里也到tm4,这样结果不是重复了吗?
  • 我滴个天老爷,我标红框的时候都是开了8倍镜找了半天,其实除了最后一组结尾数据,上面几组数据全是以tm4结尾的。
  • 但这也应征了我们的猜测,这是第三组数据,我猜测应该是4组数据相加拼接起来,得到的结果,并且这个顺序也是打乱的,我们再往上看确定一下是不是还有最后一组数据。

  • 这就是最后一组数据了,但是这个日志对于验证凭借和追溯乱码字符串有点不太明显,拼接肯定就是相加嘛,我们直接把+运算打个日志,重新看下。

  • 通过这个可以看出是将一个数组通过fromCharCode()方法得到的乱码字符串,最后把乱码字符串再拼接经过b64编码得到加密参数,但是我们还不知道这个数组是怎么来的,我们继续向上看。

  • 看到这条日志,其实已经有点苗头了。
  • 简单解释下:slice()方法是对一个数组进行浅拷贝,传入的参数是起始下标和截至下标,返回一个新的数组对象,因为是浅拷贝,原始数组不会收到影响。
  • 再简单的说,this对象,指的就是原始数组对象,传入的[12,16]就是this对象下标12开始到16截至,复制这个内容,返回新的对象。

  • 就是这个样子,这个时候其实应该有个猜想,先买个关子,继续往上看。

  • 再看这俩张日志图片,应该可以猜到了,每次只对这个字符串取4位长度,然后再做一些什么事情。
  • 其实看不透这个日志很正常,因为我们只打印了+运算符,所以日志不是很连贯,简单梳理一下:
  • 1.最终结果是通过replace()方法传入正则,这是在对b64的编码做处理。
  • 2.再往上,我们知道结果是由4段乱码字符串b64编码,再拼接得到的。
  • 3.现在我们知道,乱码字符串,是将明文字符串,4位4位的复制,再做处理(一般就是charCodeAtfromCharCode等等方法)。
  • 之所以不打印所有的运算符日志,是跟日志总数量有关系,全打印日志确实会更清晰,但日志总数量也会成倍增长,想摸清脉路鼠标的滚轮也得使劲滑,浏览器还会有卡顿,不利用直接搜索定位。
  • 这样的好处是,可以先抽丝剥茧,找到逻辑后再补充打印日志,最后完善纯算的代码。

  • 为什么当时能笃定是结果是对乱码字符串进行的b64生成的,而不是下面的明文字符串呢?
  • 我其实对2个字符串对进行b64编码,但只有对乱码进行b64是返回正确结果。当时没想明白这个明文字符串是做什么使的,但是分析到现在,我有个大胆的猜想,是不是每个乱码字符串下面都直接将明文字符串给打印出来了。如果真是这样,那么只要研究透一个加密逻辑,其他3个只需要修改明文字符串,然后拼接结果就直接得到加密参数了。我带着这个疑问去看了下日志。

  • 确实是存在3段明文字符串,那么问题就简单了,我们只需要研究一个就可以,我们拿最短的举例看下。接下来打印所有运算符的日志看下。

  • 我们先简单分析下这段日志,实现下自己的椽酸代码。

/*
slice方法讲过了,循环每次只取出'"sd":{"od":"C"}}'中的4位字符。
使用charCodeAt()方法,得到4个数字依次和,固定值与下标相乘的结果进行左移运算。
使用该结果与上一次的该结果进行位或运算(这里文字不好解释,直接贴上代码)。

打印的日志中是存在干扰日志的,用来误导我们进行纯算。(生成结果值,未用到的值,都是干扰日志,比如某些加法运算,某些位或运算,这些干扰日志仔细分析分析就能看出来。)

为了不影响各位大佬动脑分析,我就不贴干扰代码了。
路还得自己走,墙还得自己撞!
*/

function strToNum(s) {

    for (let e = 0; e < s.length; e += 4) {
        var num = 0;
        let str = s.slice(e, e + 4)
        for (let i = 0; i < str.length; i++) {
            num1 = str.charCodeAt(i)
            num = num | num1 << (8 * i)
        }
        console.log(num)
    }
}
strToNum('"sd":{"od":"C"}}')

/*
这里只是获取到的4个Num结果可以和日志对一一对应,说明我们写的代码无误,
日志中获取到2个Num结果后,由使用了其他的算法,我们再往下看。

*/

/*
这里只提取了部分日志截图。
分析日志没什么好的思路,懂密码学的大佬可能看几个特征就能知道使用的是什么算法,直接扣源码过来验证是不是标准的就万事大吉了。
我是小白,没这种底子,就只能多琢磨,多复盘。
这里不贴算法代码了,就简单说下我的分析思路吧。
先按照网站的日志来罗列,知道的值就直接写上,不知道的值就自己起个名。
第一行代码的3&0=0, 3和0 我们都不知是怎么来的,就先写上不管。
比如 1864530746 这个明显是我们上面代码得到的值,所以直接哪来用。

已知:577008418 1864530746

3 & 0 = 0
a1 = 1864530746 << 4 //结果 -232279136, 4不知道怎么来的先写上不管
a2 = 1864530746 >>> 5 //结果 58266585, 5不知道怎么来的先写上不管
a3 = a1 ^ a2 //结果 -245456775
a4 = a3 + 1864530746 //结果 1619073971
3 & 0 = 0 // 这里又出现了,先不管
a5 = 0 + 1449485153 //结果 1449485153,未知的值,先写上不管
a6 = a4 ^ a5 //结果 920942802
a7 = 577008418 + a6 //结果 1497951220
a8 = 0 + 2654435769 //结果 2654435769,未知的值,先写上不管

a9 = a8(2654435769) >>> 11 //结果 1296111, 11不知道怎么来的先写上不管
a10 = a9 & 3 //结果 3
a9 = a8(2654435769) >>> 11 //结果 1296111, 11不知道怎么来的先写上不管
a10 = a9 & 3 //结果 3
这俩个是重复日志,先写上不管

---------------------------------------------------------------------------

a11 = a7 << 4 //结果 -1802584256
a12 = a7 >>> 5 //结果 46810975  到这儿,应该发现了,历史就是轮回,代码也是! 不管接着往下看,因为目前没发现什么规律。
a13 = a11 ^ a12 //结果 -1773864929
a14 = a13 + a7 //结果 -275913709

a9 = 2654435769 >>> 11 //结果 1296111
a10 = a9 & 3 //结果 3
提示:这里还是重复代码,它的值似乎也没用到!

a15 = 1785287219 + 263183 //结果 1785550402 这里的值都没出现过,先不管
a16 = a8(2654435769) + a15 //结果 4439986171
a17 = a14 ^ a16 //结果 -416732184
a18 = 1864530746 + a17 //结果 1447798562
a19 = 3 & 2654435769 //结果 1

----------------------------------------------------------------------------

b1 = a18 << 4 //结果 1689940512
b2 = a18 >>> 5 //结果 45243705 再次写到这应该可以确定了,这就是个循环的开始,上面相加就是循环的结束
b3 = b1 ^ b2 //结果 1711812377
b4 = b3 + a18 //结果 3159610939

a19 = 3 & 2654435769 //结果 1 重复

b5 = 1144859420 + 1908012 //结果 1146767432
b6 = a8(2654435769) + b5 //结果 3801203201
b7 = 3159610939 ^ b6 //结果 1589777466
b8 = a7 + b7 //结果 3087728686
b9 = 2654435769 + 2654435769 //结果 5308871538

b10 = 5308871538 >>> 11 //结果 495070
b11 = b10 & 3 //结果 2
b10 = 5308871538 >>> 11 //结果 495070
b11 = b10 & 3 //结果 2

------------------------------------------------------------------------------

c1 = b8 << 4 //结果 -2135948576
c2 = b8 >>> 5 //结果 96491521

往下接着就都是这样类似的循环,可以多观察这其中的规律。
我这里是写了三次循环,第三次的循环中还用到了第一次的值,比如b8 = a7 +b7。
那为什么还会出现a7呢?
大佬们可以多参考这种方式,写4~6次循环,应该可以发现其中的规律,我就不写了,太累了!!!
比如有些固定值:
        << 4
        >>> 5
        2654435769 这个值也是固定值,会出现该值的累加
        还有几个值在循环种也是固定出现的,比如某些0+什么什么值

噢,还有最后一点,怎么判断他是循环了多少次呢?
密码学的大佬,可以根据特征判断是什么算法,然后直接锁定循环次数。
小白可以将这个运算部分的日志复制下来,粘贴到微软大战代码中,直接搜索<<4 或者>>> 5,应该就可以猜到循环了多少次。
懒蛋可以直接把日志贴给AI,让AI帮你分析这里面有没有强特征,能不能猜到是什么算法,然后直接搜,或者让AI帮你判断循环了多少次,我是懒蛋!

*/
  • 这个算法就先分析到这里,大佬们可以看个乐呵,小白们可以借鉴思路,感谢观看~~

总结

  • 加密参数获取如下图

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
helian147 + 1 + 1 热心回复!

查看全部评分

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

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

本版积分规则

返回列表

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

GMT+8, 2026-1-13 03:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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