虚拟机保护技术原理_2

虚拟机技术保护学习笔记

Posted by breakingdevil on January 2, 2019

虚拟机保护技术原理2—-handler设计

虚拟机保护设计技术读书笔记,《加密与解密4》

  • 辅助handler
  • 普通handler
vPushReg32:
	mov eax,dword ptr [esi]
	add esi,4
	mov eax,dword ptr [edi+eax]
	push eax
	jmp VMDispatcher

简单分析一下这个程序,esi获取到程序的字节码,一般要压栈的寄存器编号应该是被硬写入字节码当中的。edi指向当前运行环境中寄存器的上线文也就是我们的虚拟寄存器。最后将获得虚拟寄存器的值压栈。

下面是将立即数压栈:

vPushImm32:
	mov eax,dword ptr [esi]
	add esi,4
	push eax
	jmp VMDispatcher

下面是将内存地址中的值压栈,方法有些复杂。

一般而言我们将一个内存地址拆解成如下形式[imm+reg_index*scale+reg2_index]

值得注意的一点是我们一般让表达式中的所有值都为正数,imm,reg_index,reg2_index

并且一般reg_index为非正数时变为0,reg2_index同理。

vPushMem32:
	mov edx,0
	mov ecx,0
	mov eax,dword ptr [esp]
	test eax,eax
	cmovge edx,dword ptr [edi+eax]
	mov eax,dword ptr [esp+4]
	test eax,eax
	cmovge ecx,dword ptr[edi+eax]
	imul ecx,dword ptr[esp+8]
	add ecx,dword ptr[esp+0xc]
	add edx,ecx
	add esp,0x10
	push edx
	jmp VMDispatcher 

书中还列举了两个函数

vPopReg32:
	mov eax,dword ptr[esi]
	add esi,0x4
	pop dword ptr[esi+eax]
	jmp VMDispatcher
vFree:
	add esp,4
	jmp VMDispatcher

之后我们就可以吧很多的指令用我们写出的虚拟机去改写。

vadd:
	mov eax,[esp+4]
	mov ebx,[esp]
	add ebx,eax
	add esp,0x8
	push ebx
	jmp VMDispatcher
add eax,0x1234

用我们的伪代码即可表现为以下形式。

vPushImm32 0x1234
vPushReg32 eax_index
vadd
vPopReg32 eax_index

同理其他汇编指令我们可以经过精巧的构造进行实现,esi就像我们真是的eip寄存器,edi则管理相应的虚拟寄存器。