本帖最后由 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位的复制,再做处理(一般就是
charCodeAt和fromCharCode等等方法)。
- 之所以不打印所有的运算符日志,是跟日志总数量有关系,全打印日志确实会更清晰,但日志总数量也会成倍增长,想摸清脉路鼠标的滚轮也得使劲滑,浏览器还会有卡顿,不利用直接搜索定位。
- 这样的好处是,可以先抽丝剥茧,找到逻辑后再补充打印日志,最后完善纯算的代码。
- 为什么当时能笃定是结果是对乱码字符串进行的
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帮你判断循环了多少次,我是懒蛋!
*/
- 这个算法就先分析到这里,大佬们可以看个乐呵,小白们可以借鉴思路,感谢观看~~
总结
- 加密参数获取如下图
|