大家好,我们继续开始,vmp是一种保护壳,当然也是强壳一种,我们从理论上讲,我们不能靠运行,下什么messagea 和什么到00401000这样的领空了,其实我们要知道一件事情,你与其去想方设法,找那些花里胡哨方法,先研究原理。


你想想人家为啥叫vmp呢?在这里说一下,每个人说的版本不一样很正常因为2.0vmp到3.0vmp还有一个3.5的,可以有变异算法加虚拟机一大堆的。


我们其实可以抽取部分从0040100开始的,这里我说一下不是所有的解码段都是0040100这个不要误会了。你跟没有加密代码比较,你看堆栈情况,你会发现,前面好像很正常,但到了要被加密的地方,就开始作怪了。

所以作为vmp在正常时是会抽出局部代码,进行转换,转换为中间码,所谓的中间码那又是啥呢?局部又是啥?讲一个简单的例子,其实程序员写的是啥?就是代码吧,那些代码被保存在哪里?有人说在计算机中,这不是废话,有的被压入堆栈,有的不是,那么例如你一个mov eax,1就是存一个1呢,我们说的局部代码类似,但指的是在某个地址开始取,然后这些全部被抽空,可能我说的不够专业,然后呢,虚拟机引擎对这些中间码进行解释,说你必须按照这样的格式来对吧,替代CPU解释执行代码,然后跳转回源地址,每次执行都解释执行一次代码,虚拟机有一套自己的反编译算法去解释执行代码。

vmp加密的过程

虚拟机申请一块内存(可能在堆,可能在栈),保存寄存器环境,中间码执行后的结果保存到申请内存的寄存器中,执行完后,把寄存器的环境赋值给真正的寄存器,相当于中间码被cpu执行了

总结说就是

vmp的虚拟机其实是一个字节码解释器,循环的读取指令并执行,并且只有一个入口和一个出口

虚假跳转和***指令, vmp会使用大量的虚拟跳转和***指令将原有简单的代码变得复杂

vmp是基于堆栈的虚拟机,虚拟机指令不是显示的读取参数,而是把要使用的参数压入堆栈,而后直接从堆栈中读取

随机效验比较牛B, vmp会在编译好的字节码中加入自己的一些指令(专属于vmp自动的指令), 每一次执行都会对一段代码随机生成hash值, 然后与另一个随机数相加, vmp要求相加的结果必须为0, 否则会出错.

从3.0到3.5可能是比较复杂的,我们理论部分先讲到这里,后期我会继续往下讲的,让你理解不一样的vmp教程!



打赏我,让我更有动力~

0 条回复   |  直到 6小时前 | 6 次浏览
登录后才可发表内容
每日签到
0人
连续签到0天