某乎x96jsvmp算法还原新手初体验
本帖最后由 lianguhong 于 2022-6-6 08:50 编辑@漁滒跟栈跟值分析移步大佬文章 没人比大佬更详细 这里主要分析还原算法
样本:aHR0cHM6Ly93d3cuemhpaHUuY29tLw==
主要日志断点位置:
e.r(i, i) -->主要是charCodeAt和charAt
e.r + e.r -->密文拼接
e.r | e.r-->对每组每个元素的运算
e.r & e.r --> 密文运算
e.r >>> e.r --> 每组二 三 四次密文运算
不妙 这里说完了怎么分析
直接进入算法分析环节
查看日志 从结果反跟 获得信息:密文为 'aXFqc4uykHtY6Rt0M_Y8FD98e8NpgU28G0Yyo09yoTNX'当然这里是正确的结果
再往上看 发现 是计算出每个值并拼接而成 且仔细的靓仔也发现了 "X" 来自对照表.charAt(4,) 那么 "4" 来自哪里内 我们接着往上
push(4) pop(4)没用 接着往上
锵锵 对left值进行 & 63 得到 那么接着跟left的4
又是两个值运算注意这两个值经过1204791>>> 得到4 charAt(4,) = “X” 当然还对1204791有兴趣 上跟
没有发现 right值18 反倒是一直在用left的值1204791 又对其12- 6- 63运算 并得到了密文后四位"oTNX"继续跟1204791的生成 搜索 = 1204791
也是两个值运算得到right值就在上面这么近先跟它
两个值运算好家伙永无止境了嘛 不是
终于看到传入的明文了 取了下标0并charCodeAt 明明是最后一个密文拼接还取0搜索"8b7997937c8e4f4a0ca46008f9285561\u0000\".charCodeAt(嗯 是倒着取明文的
所以前面1204791 的right值= charCodeAt(0,) ^ 42<< 16当然42 和16 都是根据加密轮数变化的
1204791的left值就长跟短说 搜索 = 25143
删去点没有的日志 1204791的left值 = 55|charCodeAt(1,) << 8 这么简单 不是 由跑出个55是未知的 还有前面不是 << 16这里又<< 8
只对charCodeAt(1,)^ 0 嗯 四个密文到头了取了前三个下标内容 猜测就是倒序3个一组
单单一组 "oTNX" 的结束了 纵观全局也是这样处理的 无非运算时对几个固定值随加密轮数变化
结论
算法
测试这个函数,与浏览器生成的值是一样的 当然可以写的更优雅点
var jjj = "RuPtXwxpThIZ0qyz_9fYLCOV8B1mMGKs7UnFHgN3iDaWAJE-Qrk2ecSo6bjd4vl5"
function sign(data){
let a = b = c = 0
let A =
let B =
let C =
let len = data.length
len % 3 == 1 ? data += "\u0000\u0000" : len % 3 == 2 ? data += "\u0000" : null
len = data.length
let result = ''
function AA(){
a == A.length ? a = 0:null
return A
}
function BB(){
b == B.length ? b = 0:null
return B
}
function CC(){
c == C.length ? c = 0:null
return C
}
for(;len > 0; len = len-3) {
let D = (data.charCodeAt(len -1) ^ AA()) | ((data.charCodeAt(len -2) ^ AA()) << BB())
let E = D |((data.charCodeAt(len -3) ^ AA()) << BB())
result += jjj.charAt(E & CC())
result += jjj.charAt((E >>> CC()) & 63)
result += jjj.charAt((E >>> CC()) & 63)
result += jjj.charAt((E >>> CC()) & 63)
}
return result
}
//sign(data)
多谢大佬! lianguhong 发表于 2022-6-6 02:25
图越改越乱 我不玩了
为啥不直接发文字了?图片好像就最后一个没贴进去? 图越改越乱 我不玩了{:1_909:} 这也忒BT了 分析VMP还是需要自动化工具辅助一下,徒手太硬了! 大佬牛逼 大佬牛掰 学习了,大神厉害
页:
[1]
2