lianguhong 发表于 2022-6-6 01:54

某乎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)




moyanblade112 发表于 2022-6-7 08:51

多谢大佬!

Hmily 发表于 2022-6-6 15:04

lianguhong 发表于 2022-6-6 02:25
图越改越乱 我不玩了

为啥不直接发文字了?图片好像就最后一个没贴进去?

lianguhong 发表于 2022-6-6 02:25

图越改越乱 我不玩了{:1_909:}

一米七五 发表于 2022-6-6 19:44

这也忒BT了

minibeetuaman 发表于 2022-6-7 09:03

分析VMP还是需要自动化工具辅助一下,徒手太硬了!

shayu2021 发表于 2022-6-7 09:05

jiangshan567 发表于 2022-6-7 09:12

大佬牛逼

qwe2323 发表于 2022-6-7 12:51

大佬牛掰

Fxmles 发表于 2022-6-7 13:11

学习了,大神厉害
页: [1] 2
查看完整版本: 某乎x96jsvmp算法还原新手初体验