虚拟机加密,是把源程序的X86指令变成自定义的伪指令,执行时内置在保护程序中的VM就会启动,读取伪指令,然后解析执行 基础知识 虚拟机加密,是把源程序的X86指令变成自定义的伪指令,执行时内置在保护程序中的VM就会启动,读取伪指令,然后解析执行
每个伪指令对应一个相应的Handler
这就是实现虚拟机指令的Handler
下面就是一条变型后的指令,其目的就是push 一个word入栈 VM_PUSHw_IMMEDIATEw (压入堆栈WORD) 代码: MOV AX,WORD PTR DS:[ESI-2] XCHG AL,AH SUB AX,BX ADD AX,0F271 NEG AX XOR AX,1CA6 SUB BX,AX SUB BX,AX LEA ESI,[ESI-2] MOV WORD PTR SS:[EBP],AX
VMProtect简介 VMP是一个栈虚拟机,它的一切操作都是基于堆栈传递的。在VMP中,每一个伪指令就对应一个handler,VM中有一个核心的Dispatch部分读取程序的bytecode,然后在DispatchiTable里面定位到不同的handler中执行。绝大多数情况下,在一个handler中执行完成后,程序将回到Dispatch部分,然后到next handler中执行,见下图:
X86寄存器基本用途 EBP和EDI是VM堆栈指针(不是常规的堆栈) ESI是伪指令指针(相当于常规的EIP) EAX是VM解密数据的主运算寄存器 EBX是VM解密数据的辅运算寄存器 ECX是常规的循环计数器 ESP是常规的堆栈栈顶指针 EDX是读取伪指令表数据; EDI 指向堆栈的上限并使用[EDI+EAX]的方式向下发展 EBP指向堆栈的下限并向上发展 ESI指向的内存块里包括要执行的伪指令序列,而不同的是,当VM要是使用到立即数时,也是从ESI读取
VM第一印象 入口 堆栈
解密执行
VMP Unpacking Key Point
理论知识 SHE, VEH(异常处理) 发生异常时系统的处理顺序: 1.系统首先判断异常是否应发送给目标程序的异常处理例程,如果应该发送,目标程序正在被调试,则系统 挂起程序并向调试器发送EXCEPTION_DEBUG_EVENT消息 2.如果程序没有被调试或者调试器未能处理异常,系统会继续查找你是否安装了线程相关的异常处理例程,如果安装了,系统就把异常发送给程序seh处理例程,交由其处理 3.每个线程相关的异常处理例程可以处理或者不处理这个异常,如果不处理并且安装了多个线程相关的异常处理例程,交由其他例程处理. 4.如果这些例程均选择不处理异常,且程序处于被调试状态,系统仍会再次挂起程序通知调试器 5.如程序未处于被调试状态或者debugger没有能够处理,并且用SetUnhandledExceptionFilter安装了最后异常处理例程的话,系统转向对它的调用
异常触发流程
异常分发流程
注册一个SHE例程 ASSUME FS:NOTHING push offset perThread_Handler push fs:[0] mov fs:[0],esp xor ecx,ecx mov eax,200 cdq div ecx
传递给异常处理句柄的参数 EXCEPTION_RECORD STRUCT EXCEPTION_RECORD ENDS ; ExceptionCode DWORD ? ;//异常码 ExceptionFlags DWORD ? ;//异常标志 pExceptionRecord DWORD ? ;//指向另外一个EXCEPTION_RECORD的指针 ExceptionAddress DWORD ? ;//异常发生的地址 NumberParameters DWORD ? ;//下面ExceptionInformation所含有的dword数目 ExceptionInformation DWORD EXCEPTION_MAXIMUM_PARAMETERS dup(?) EXCEPTION_RECORD ENDS ;
重要的结构 程序新的开始的地方
下图是系统异常处理时调用程序注册的异常处理Handler 直接在返回后下断(为什么?????)
工具 (VMP分析插件) 插件的”打开虚拟机指令窗口”,找到vRet和vCall指令下断(为什么要找这两条指令????)
VMP IAT修复 1. VMSweeper 2. 清除TLS
VMP的一些Anti 1. 2. 3. VMware后门检测 mov eax, 564D5868h mov ebx, 00000000h mov ecx, 0000000Ah mov edx, 00005658h in eax, dx
4. NtSetInformationThread HideFromDebugger 5. GetModuleFileName ("SbieDll.dll")
参考资料 http://bbs.pediy.com/showthread.php?t=121412&highlight=VMP