目录
-
-
-
- 一、案例分析
- 二、collect参数定位与分析
-
-
一、案例分析
提示:此篇文章并没有解决整个滑块部分,
如明文如何生成都未研究,只是在已有明文的基础下,去研究了jsvmp执行的流程与插桩的尝试过程,仅仅是思路过程学习记录- 网址如下,研究的是这个接口aHR0cHM6Ly9tYWlsLnFxLmNvbS8= 下的collect参数和vData参数
文章图片
文章图片
- 搜索关键词
collectdata
定位,然后打上断点,然后滑动滑块,如图断住了
文章图片
- console界面输出
x()函数
,如图即生成了collect参数
文章图片
- 在console界面打印x函数,点击进入发现collect其实就是
a.getData(!0)
生成的
文章图片
- 【SpiderCrawl|js逆向-腾讯滑块collect参数】仅接着打印a.getData函数,即进入jsvmp的代码里,最终在
return __TENCENT_CHAOS_VM(x, U, T, M, c, E, Y, B)
这里返回collect参数
文章图片
- 单步调试进入__TENCENT_CHAOS_VM函数,我们会发现在如图位置反复执行,然后我们在266行这里插桩
JSON.stringify(j.slice(-2))
,输出日志,以及网上日志查看,根据经验先大概的猜测,长数字转乱码小串拼接,乱码小串base64得到collect
文章图片
文章图片
- 在反复调试的过程中,你会发现D是一个大数组,里面几乎都是函数,而U[w]决定了取哪个函数进行执行操作,而贯穿的j数组则是在
j[j.length-2] 与 j.pop()
反复的进行覆盖以及算术操作等,大致执行流程熟悉后,我们开始正式的插桩分析
文章图片
- 第一次插桩打日志点,如下图,我是将线上的slide.js的js文件保存到本地为tencent.js,然后添加了部分插桩日志内容,然后用fiddler进行了替换输出
文章图片
文章图片
j[j.length - 2] = j[j.length - 2] + j.pop() if(typeof j[j.length - 1] == "string"){ console.log("j栈的输出", j[j.length - 1]); }
- 如图,刷新后,线上console界面输出如下,可以知道collect由4个超长的字符串拼接而成,console界面输出的collect将所有的"+"替换为空
collect.replace(/\+/g, " ")
,则和请求参数界面一致
文章图片
文章图片
- 第一组长串可知,超长串是由超长乱码串base64加密而得
文章图片
文章图片
- 超长的乱码串是由小的乱码串拼接而成,小的乱码串其实是由长数字转换而得
文章图片
文章图片
- 第二次插桩打断点,可以知道
?^? ?°>
乱码小串是由这个类似String.fromCharCode.apply(String, [199, 16, 94, 255])
转换而得,下面就是要知道[199, 16, 94, 255]这个数字是怎么来的
"quality的输出", M[0][M[1]], M[0], F, quality
文章图片
文章图片
- 第三次添加条件断点
M[0]==='{"cd'
,然后跳到这里停住后,继续加其它的日志
文章图片
- 第四次加如下这些日志,在
& / >>
,j[j.length - 2], ">>>", j.slice(-1), "result is", j[j.length - 2]>>> j.slice(-1)[0]
,以及一些其它的日志断点,这些日志断点建议等条件断点断住后,再开放这些日志断点输出
文章图片
文章图片
"quality的输出", M[0][M[1]], M[0], F, quality "fit",fit, "F[0]", F[0] "shipment", shipment
文章图片
文章图片
文章图片
-
[199, 16, 94, 255]
的由来如图,至此我们得到第一个算法函数LongNumToCode
,长数字转成乱码小串,接下来就是研究[-10612537,1051754885]
这个长数字是怎么来的,这个是最难的部分,是由另一个长数字经过tea算法转换而得
文章图片
function LongNumToCode(long_num){ var offsets = [0, 8, 16, 24]; var codes = []; for(var a of offsets){ codes.push(long_num >> a & 255); } return String.fromCharCode.apply(String, codes); }
- 接着前面的输出日志继续分析,如图得到第二个算法函数
StrToLongNum
,这里得到两个长数字[ 1684218491, 811285026 ]
,与我们前面需要的长数字不一致,继续分析[ 1684218491, 811285026 ]接下来是干什么了
文章图片
文章图片
function StrToLongNum(str){ var offsets = [0, 8, 16, 24]; var long_num = 0; for (let i = 0; i < str.length; i++){ long_num = long_num | (str.charCodeAt(i) << offsets[i]); } return long_num }
- 继续分析,可以得到第二个算法函数tea加密算法,在图中会发现一个特征数字
2654435769
经常出现,此为tea加密算法 ,以及该大佬的文章也有说,还有逆向简史的大佬也有讲到,如图已知长数字[ 1684218491, 811285026 ]
,得到了新的长数字[-10612537,1051754885]
文章图片
文章图片
文章图片
function teaEncryptBlock(num_lis, key){ var num1 = num_lis[0]; var num2 = num_lis[1]; var sum = 0; // 1194941531 '+' [592134] 'result is' 1195533665 // 1214603871 '+' [394760] 'result is' 1214998631 key = [1195533665, 1214998631, 1416189259, 1481725512]; var delta = 2654435769; for (var i = 0; i < 32; i++) { num1 += (((num2 << 4) ^ (num2 >>> 5)) + num2) ^ (sum + key[sum & 3]); // console.log("num1", num1) sum += delta; // console.log("sum", sum) num2 += (((num1 << 4) ^ (num1 >>> 5)) + num1) ^ (sum + key[(sum >> 11) & 3]); // console.log("num2", num2) } return [num1, num2]; }
- 将前面分析的算法函数进行梳理下,然后输出如下,与网页结果保持一致,至此collect参数分析完毕,
但是这些明文/轨迹的生成未研究,也是最难的部分,感兴趣可以自行试试
推荐阅读
- SpiderCrawl|js逆向案例-反调试/jsfuck/cookie/des/ttf字体
- Python|8个无需编写代码即可使用Python内置库的方法
- Python|Python打开修图的最新方式,直男必学
- Python|【python量化】将Transformer模型用于股票价格预测
- Python实战项目|Python+Selenium实现短视频自动上传与发布
- Python实战项目|如何用 Python 实现企业微信通知
- Python|【Python】和【Jupyter notebook】的正确安装方式
- Python实战项目|用Python模拟识别图片验证码并发送手机验证码
- Python|用几行Python代码模拟评委打分