虚拟机保护技术原理_1

虚拟机技术保护学习笔记

Posted by breakingdevil on January 1, 2019

虚拟机保护技术原理①

这里讨论的虚拟机和VMware之类的虚拟机不是一样的,这是一种基于虚拟机的软件保护技术,见过一些虚拟机保护过的算法程序,于是想探究虚拟机保护技术的具体原理。学习《加密与解密4》读书笔记。

我们来先说一说虚拟机是什么?

​ 虚拟机保护技术是将x86的汇编系统的可执行代码转化为字节码指令系统的代码来对自己算法的保护。

​ 我们这里的字节码指令系统是在x86指令系统上建立的。每个虚拟机都有自己的字节码,不同的虚拟机之间的字节码不相同,仅供自己使用。

​ 虚拟机大致可以分为以下几部分VStartVM(用来初始化虚拟机),VMDispatcher(调度器,相当于分发到对应的指令),Handler(一般而言,一个handler对应一个汇编指令),Bytecode(字节码,我们自己设定的字节码系统)。

​ 一般而言现在最多的虚拟机是Stack-Based,很少有Register-Based 例如 Lua 5。

启动框架和调用约定

​ 启动框架和Handler之间是相辅相成的,都是一种调用约定。VStartVM会先生成环境然后启动VMDispatcher,先将所有寄存器压栈,esi指向字节码起始地址,ebp指向真实栈,edi指向VMContext。esi读取一个字节后就跳入handler去执行。

VMStartVM:
	push eax
	push ebx
	push ecx
	push edx
	push esi
	push edi
	push ebp
	pushfd
	mov esi,[esp+0x20]
	mov ebp,esp
	sub esp,0x200
	mov edi,esp
	sub esp,0x40
VMDispatcher:
	movzx eax,byte ptr [esi]
	lea esi,[esi+1]
	jmp dword ptr [eax*4+JUMPADDR]

当我们要调用虚拟机的时候只需:

push byteCodeAddr
jump VMStartVM
  • edi与VMContext值相等
  • esi指向字节码
  • ebp指向真实的栈地址
struct VMcontext
{
    DWORD v_eax;
    DWORD v_ebx;
    DWORD v_ecx;
    DWORD v_edx;
    DWORD v_esi;
    DWORD v_edi;
    DWORD v_ebp;
    DWORD v_eflag; // 符号寄存器
};

esp的值被存放在真实的ebp中了。

我们来画一下栈结构:

 
小地址段
 
 
esp指向这里
…..0x40bytes
edi指向这里 也就是VMContext
…..0x200bytes
VMStart压入的几个寄存器和eflag ebp指向这里
字节码起始地址

下面就要开始虚拟环境的配置了:

vBegin:
	mov eax,dword ptr[ebp]
	mov [edi+0x1C],eax          
	add ebp,4                  #把环境的寄存器的值搬到VMontext的区域
	...
	mov eax,dowrd ptr[ebp]
	mov [edi],eax
	add ebp,4
	add ebp,4
	jmp VMDispatcher

栈平衡了。

为了防止VMContext被覆盖的可能性,会有vCheckESP,检测sep是否离VMContext过近,如果近则将VMContext搬离。

vCheckESP:
	lea eax,dword ptr[edi+0x100]
	cmp eax,ebp
	jl VMDispatcher
	mov edx,edi
	mov ecx,esp
	sub ecx,edx
	push esi
	mov esi,esp
	sub esp,0x60
	mov edi,esp
	push edi
	sub esp,0x40
	cld
	rep movsb
	pop edi
	pop esi