本文仅作学习使用
1.目标
aHR0cHM6Ly9tc3Nkay1zZy50aWt0b2suY29tL3dlYi9yZXBvcnQ/bXNUb2tlbj1ISEhrTHJFN0pWZlNUdE5lei1LOW9YeE96WlpHSFlmOEFKd1pEMUdmRzluNlgtWE9sTUdOcmpSUGZsZ0FrdVhOWGlIb1BvejFfNENXMXdmVnFvamkwZ2FRSVlITEUxaG03VllLUW1oNXM0NWpTNjRVTUNFQ3RIZnI0WF9LMkdYQ2c4MGpCbktIYm1ZaWREbz0mWC1Cb2d1cz1ERlN6c3dTN01ZRFBTRUd0Q3plN3g5WEZoc2JJDQo=
2. debug
2.1 xhr断点

2.2 经典jsvmp输出日志
bash
"执行 M->",l,"执行func->", M[sg[112]]," 参数 B-> ",B,"返回 N->",N
bash
N&&console.log("执行 p->",p,"执行func->",sg[320]," 参数 o-> ",o," 参数 i-> ",i," 参数 u-> ",u," 参数 a-> ",a," 参数 c-> ",c," 参数 f-> ",f," 参数 s-> ",s," 参数 l-> ",l)
bash
N&&console.log("执行 hg->",hg,"执行func->", hg[2]," 参数 N[0]-> ",N[0]," 参数 q-> ",q," 参数 I-> ",I," 参数 N[1]-> ",N[1])
bash
!N&&console.log("执行 B->",B,"执行func->", B[sg[256]]," 对象 q-> ",q," 参数 I-> ",I,"返回 A->",A,"typeof A:",typeof A)
2.3 日志分析
拿到日志后分析,日志大概几十万行
- 一阶段str-code-str:
初始化码表并动态存取
双递归计算
上下文运算值关联 - 二阶段加盐
静态数组+时间戳+随机数计算盐和盐arr(扣代码即可)
str加盐,盐arr转str,截取拼接 - 三阶段生成数据
str递归截取运算生成code
使用新码表取值
2.4 注意点
一阶段取值后的结尾,递归8时未结束需要继续递归,并将最终输出值记录
二阶段加盐时控制流里面会把字符L先拼在前面
三节点取值结尾。若str长度不够3,则生成的4位数向后补=
3. Note
最后一,三阶段放一下经典码表吧
bash
//初始化码表
var code_table = {}
for (let i = 0; i < 256; i++) {
code_table[String.fromCharCode(i)] = i
}
注意此码表后面会一直往里push
bash
Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=
然后再补个最终输出的截图

这玩意确实有点复杂,有很多坑,纯算算了5天