VM保护技术

【破文标题】手把手教你使用WINDBG KO XXXX游戏驱动保护
【破文作者】lj8888
【作者邮箱】xxxx@163.com
【作者主页】-
【破解工具】windbg 6.7
【破解平台】D版 XP SP3
【软件名称】
【软件大小】
【原版下载】
【保护方式】
【软件简介】当前正在内测的大型网游
【破解声明】菜鸟提供一点破解验证另类思路。如有失误之处纯属意外! 请高手直接飘过!

1.VM技术介绍
这里说的VM并不是像VMWare那样的虚拟机,而是将一系列的指令解释成bytecode(字节码)放在一个解释引擎中执行。

 

2.VM的一些原理
一个虚拟机引擎由编译器、解释器和VPU Context(虚拟CPU环境)组成,再配上一个或多个指令系统。
编译器:将一条条X86指令解释成自己的指令系统。
解释器:解释器附加在被加壳的软件中,用来解释这些自定义的指令。
指令系统:一套或多套自己定义的指令系统,用来虚拟执行这些bytecode。

 

现在讲讲虚拟机是如何运作的,首先加壳程序先把已知的X86指令解释成了字节码,放在PE文件中,然后将原处代码删掉,
改成类似的代码进入虚拟机执行循环。
push bytecode
jmp VstartVM

VstartVM是进入虚拟机的函数,它的代码大概类似这样的
// 进入虚拟机函数,我的最初版本是写死在成种VC环境下的,不过这样处理起来很麻烦。

void _declspec(naked) VStartVM()

{

_asm

{

// 将寄存器压入堆栈,由伪指令取出存放到VMReg中

//可以考虑为压栈时加入一些随机性

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

Next:

movzx eax,byte ptr [esi]

lea esi,[esi+1]

jmp dword ptr [eax*4+JUMPADDR] ;跳到Handler执行处,由加壳引擎填充

VM_END ;VM结束标记

}

}
然后每读一个byte跳到目标处模拟执行代码。
JUMPADDR就是一张函数表(让我想到了VTBL),每次从内存里读出一个command code(其实就是偏移),然后转向那个过程,如vEnter的代码:
// enter和执行下列代码用途相同

//push ebp

//mov ebp,esp

//sub esp,(L - 1) * 4 ; L > 0才有这步操作,用来存储嵌套的L - 1个子过程的栈框架指针(注意是指针)

//push ebp ; 当前过程的栈框架指针

//sub esp,N

mov edx,[edi+Ebp]
sub ebp,4
mov dword ptr [ebp],edx
mov edx,ebp
mov [edi+Esp],edx
mov edx,ebp
lea ecx,[ecx*4];ecx是从内存读出的opcode
sub edx,ecx
sub edx,4
test ecx,ecx
cmovne ebp,edx
mov edx,[edi+Ebp]
sub ebp,4
mov dword ptr [ebp],edx
sub ebp,eax
//。。一些修正堆栈的工作
jmp next
以上代码就是模拟一个enter指令的代码,我不会汇编,就只能写成这样了。

现在再来看看它们的执行过程:
1.首先进入虚拟机,压入寄存器,然后设计一些伪指令来将寄存器保存到虚拟机环境中去。
2.一切工作就绪,真实寄存器存放的值是什么已经不重要了,因为我们将它存放到了虚拟环境中去了,自己可以随便使用而不用怕影响到原来的代码。
3.这时从那句jmp table看起,从[esi]得到一个偏移,它指向的就是vEnter的地址,于是它来到了vEnter处
4.vEnter又从内存中得到opcode,模拟出这句代码,并存放到堆栈。
5.注意有时要修正虚拟堆栈寄存器的值,否则会挂得很惨。
6.Jmp 到 next,这时转向第2步。



其他指令如同vEnter一样。。。发挥你的想像力了。



2-6就是一个虚拟机的执行过程,如果你曾经调试过VM,是否会对jmp [table+x]似曾相识呢?

一个简单的VM引擎就是这个样子,不过一个专业化、商业化的引擎可不仅是这个样子,还要注重很多东西,比如多线程、流程化指令,虚拟-现实之间的转换,支持SEH异常(包括VB、VC的异常)。


看到这里,你可以发现,虚拟机就是一层复杂的壳子,把原来的代码藏得毫无踪影,如果你想还原出原来的代码(基于更高级的理论来说,暂时已经不可能了),那么你需要先复习一下IA64,然后仔细研究VM执行体,逆向出Table中用到的函数,得出它正在执行哪一条语句的哪一“部分”。。。除非你要研究的程序达到了一定的价值,不然我想等你弄清楚这个程序如何执行的时候,意义已经不大了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值