vmp壳基础原理

VMP壳 :是用来保护关键的代码段的一种加密壳
原理:抽出局部代码,转变为中间码,虚拟机引擎对中间码进行解释,替代CPU解释执行代码,然后跳转回源地址,每次执行都解释执行一次代码,虚拟机有一套自己的反编译算法去解释执行代码:
比如
mov = 0xe8 ebx = 02 eax = 01 mov ebx,eax 被虚拟机解释执行为 e8 02 01
注意:这套虚拟机对应的反编译算法是根据程序的不同随机的产生
 

 

 

VMP壳
原理 :把虚拟机执行的代码,在用自己的反汇编引擎分析出来,达到解密的效果
 
虚拟机句柄的概念:某一类的机器码mov,add,等其他指令不同的解释执行代码
 
VMP壳加密代码调用过程:
1 虚拟机申请一块内存(可能在堆,可能在栈),保存寄存器环境,中间码执行后的结果保存到申请内存的寄存器中,执行完后,把寄存器的环境赋值给真正的寄存器,相当于中间码被cpu执行了
 
VMP堆栈图

 

 

ebp 保存中间码栈环境
esp 保存虚拟机环境的栈环境
 
 
 
补充:
1 中间码和虚拟机引擎都会放在代码段下面
2 虚拟机的分类:
栈式虚拟机- 所有操作数通过出栈入栈进行操作, 优点:中间码体积小, 缺点:执行代码效率低
中间码: add eax0, ebx0 虚拟机:push eax0 push ebx0 pop ecx pop edx add ecx, edx mov eax0, ecx push ecx
注意:中间码的寄存器带个0
 
典型代表: java,lua5.0以前是 栈式虚拟机
 
寄存器式虚拟机 - 所有操作数通过内部寄存器操作,优点: 执行代码效率高 缺点: 中间码的体积大
有一块内存, 相当于自己的寄存器,reg0 - reg16
中间码:add eax0, ebx0 虚拟机: mov reg0, eax0 //reg0 reg1 等寄存器是虚拟机在堆中或栈中模拟的寄存器 mov reg1, ebx0 add reg0, reg1 mov eax0, reg0
 
典型代表: lua5.0以后,davik(android 5.0) 寄存器式虚拟机
 
jit - just in time ,即时编译, 将中间码翻译成机器码执行
典型代表: .net, android art, java现在版本
vmprotect
posted @ 2020-06-03 10:24  拂树若生花  阅读(4060)  评论(0编辑  收藏  举报