本帖最后由 dddd0526 于 2026-1-6 15:47 编辑
前言
文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口均已做脱敏处理。严正声明禁止用于商业和非法用途,否则由此产生的一切后果与作者本人无关。
- 站点:某讯
jsvmp(一)
- 加密点:滑块参数
- 网址:
aHR0cHM6Ly9hY2NvdW50cy5kb3ViYW4uY29tL3Bhc3Nwb3J0L2xvZ2lu
简单贴下加密参数图片:
img1
1.什么是VMP?
答:虚拟机保护技术
解释:此处的虚拟机保护技术和VM(虚拟机)不是同一种东西,它是基于虚拟机的代码保护技术,将基于X86汇编系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向或篡改的目的。
2.VMP的工作原理是什么?
- 代码转换:
- 初始编译:将高层次语言(如
C++、C#等)编译成x86汇编代码或中间表示(IR)。
- 字节码生成:将
x86汇编代码转换为虚拟机特定的字节码指令。这个转换过程会混淆和加密指令,生成难以理解的字节码。
- 虚拟机执行:
- 解释器:在程序运行时,一个专门的虚拟机解释器负责解释和执行这些字节码指令。
- 动态执行:解释器逐条读取字节码指令并在底层的
x86指令系统上执行相应的操作。
- 简单的说:
注:太过于底层的东西,我们暂且不续,接着说回正题!
3.跟栈
img2
img3
img4
img5
简单的跟栈手法我就不在过多叙述了,跟到这里会发现,a参数和l参数中并没有我们想要的加密值。这时候可以网上看看代码的执行过程,我是直接找到最上面的方法,看e和t参数,t参数中就有我们的加密值,我们直接向上追栈。
img6
这个时候就已经很明显了,我们的加密参数生成位置。
img7
这样就可以清晰的看到,a就是我们想要的加密值,它是通过o.getTdcData方法然后又经过了decodeURIComponent方法解码得到的。我们在o.getTdcData方法处打断点,重新断住。
img8
img9
img10
4.分析指令集
到这一步就需要看下代码,仔细分析分析了。其实大佬们看到这里的代码就已经明白了,这里是整个VMP的精华部分,也是我们搞小动作的地方,至于原因,我来说下我自己的见解,不一定正确,各位听听就好。
首先VMP是什么我们上面已经说过,是把高级层面的编程语言转换成汇编代码,然后把汇编代码转换成虚拟机可执行的虚拟机特定的字节码指令。
那么我们该怎么理解这句话呢?看见什么编程语言、汇编指令、字节码指令等等词汇头都大了,我用我的方言简单解释下。汇编代码最基本的就是对堆栈的操作,比如入栈和出栈、计算等等。那么用js代码如何来实现这一操作呢?没错,这里就是使用pop、push方法,分别对应出栈(从堆栈顶部取出数据)和入栈(将数据存入堆栈顶部),堆栈遵循"先进后出"原则。
我们先把这个指令集代码全部扣出来,分析一下下。
img11
把所有方法都折叠后发现,只有一个方法是自执行的,其他几个对象都没有主动执行,都是被动调用的,所以我们重点先分析自执行函数。
有兴趣的大佬可以看下指令集的代码,了解下代码的流程,可以很方便的定位到。
那么也有和我一样,看不懂代码的小白,那么我们该如何定位呢?接着往下看。
上面我们已经说过,VMP的四个步骤,虚拟机初始化、指令调度、指令处理、循环执行,所以我们处理时,第一是先找到指令集代码所在文件,也就是我们刚刚跟栈跟到的这个文件,第二是找到指令集,也就是指令调度和指令处理的环节,何谓指令调度,就是从字节码中读取下一条指令,也就是下一步我该怎么走,何又谓指令处理呢?就是对每一个字节码指令的处理,执行对应的操作。再结合指令集最大的特点,循环操作。那么范围其实就已经很小了。
img12
我们定位到指令集后就可以在指令集位置下日志断点,结合日志来分析加密逻辑,逆推出加密的代码。
6.插桩日志
img13
日志大概是7万条左右,不是很多,各位大佬们可以先自行尝试下,看看能不能靠自己还原出这个VMP的加密代码。
贴个我成功还原的图~~
img14
日志分析的内容放在下一篇~
总结
代码不多,非常适合新手小白练手!
|