[专题]虚拟机技术专题讨论

您所在的位置:网站首页 left软件 [专题]虚拟机技术专题讨论

[专题]虚拟机技术专题讨论

#[专题]虚拟机技术专题讨论| 来源: 网络整理| 查看: 265

虚拟机技术专题讨论   看雪论坛现在没什么技术亮点,为了活跃论坛气氛,应kanxue邀请,搞一个“虚拟机相关技术”的专题讨论,欢迎各位高手共同切磋交流。       加密历史回顾       [LEFT][LEFT]         在古代,人和人之间的信任并不是唯一要关心的问题,身份验证也很重要。如果只有少数人能读会写,那么签名或许足以证明一个人的身份。但随着掌握读写知识的人越来越多,印章逐渐成为“签署人”一种独特的记号。利用这种记号,便可证明信件、文档和法令签署人的身份确实无误。但随着技术的发展,人们可轻松仿制出各式各样的印章,所以它也失却了原先的“独特”性。事实上,伪造印章是件再容易不过的事情。   [/LEFT] [LEFT]加密技术的出现最早在军队的通讯上。相传当年凯撒大帝行军打仗时为了保证自己的命令不被敌军知道,使用了一种特殊的方法进行通信,以确保信息传递的安全。这种密码便是著名的“凯撒密码(The Caesar Cipher)。他的原理很简单,说到底就是字母于字母之间的替换。[/LEFT] [/LEFT]   [LEFT][LEFT]自凯撒大帝的年代开始,一直到当代计算机网络,通信技术在稳步地发展着,同时,保障这些通信的安全也逐渐成为一项重要课题。 [/LEFT] [/LEFT]     [LEFT][LEFT]软件保护历史回顾:(注:我并不是一路走来的人,可能会有错) [/LEFT] [/LEFT]   [LEFT][LEFT]    10-20年前,那时懂计算机语言的人极少,懂得破解程序的人就更少了。后来IT行业经过几十年的迅猛发展,从DOS时代走向WINDOWS时代,程序理论走向软件工程理论,软件加密解密技术也逐渐趋于成熟,这几年加密解密技术无论是软件还是硬件都一直像矛与盾一样对抗着。[/LEFT] [/LEFT]   [LEFT][LEFT]早期的加密要算是ASPack和UPX吧,它们是我最早见过的压缩壳,那时我完全不明白它是如何完成这件事,只觉得很神奇,或者说它们不是为了加密,而单纯是为了压缩吧,这种壳很好脱,简简单单的单步几下就能看到原来的内容了。[/LEFT] [/LEFT]   [LEFT][LEFT]随着技术的逐渐发展,战场逐渐转向了对PE文件的修改,如IAT加密,不过还原起来还是很简单。[/LEFT] [/LEFT]   [LEFT][LEFT]随着时间的推移,一系列的新技术新思想都逐渐出炉,软件保护由PE文件压缩走向着重对PE文件的保护,一系列的anti出现了,不过道高一尺,魔高一丈,这些都被Cracker找出来并饶过了它的anti又一次看到了软件的真面目。[/LEFT] [/LEFT]   [LEFT][LEFT]以前的壳都是对PE文件加密,而不会对代码做任何改动,后来又出现了一项新技术:stolen code,修复这种壳开始有点费时了。[/LEFT] [/LEFT]     [LEFT][LEFT]保护技术的新方向:[/LEFT] [/LEFT]   [LEFT][LEFT]近年来,软件保护技术又出现了一个新的进步,那就是VM和代码混淆。通过对代码的变形来达到保护软件的目的,想修复被这种保护壳保护的软件,用现有的解密理论是极其痛苦的。这次就单独讲讲VM的保护技术。 [/LEFT] [/LEFT]   VM保护技术   1.VM技术介绍      我发现论坛上每当谈到虚拟机技术时,鲜有几人参与讨论,因为虚拟机技术还没有普及到大家的心中。VM 其实就是Virtual Machine(虚拟机)的缩写,这里说的VM并不是像VMWare那样的虚拟机,而是将一系列的指令解释成bytecode(字节码)放在一个解释引擎中执行。      2.目前现状的VM应用   VM技术最早的应用我想应该是VB(PCode)吧(瞎猜的),时至今日才被人们广泛用于安全技术中。   如今已经将虚拟机应用到商业中的保护壳现有三款:Vmprotect,themida和 execrypt,   Themida是一款综合型强壳,资源加密、代码变形和虚拟机技术用得是面面俱到。   Execrypt 比Themida逊色一点,不过我没研究过。   Vmprotect是一款专门对代码加VM的加壳软件,其保护强度是3款当中最强的,最早由2005年问世起,至今尚无人公开宣称能还原其原汇编代码,可见其强度,所以VMP已逐渐被人们用来保护其产品,使Cracker们对于这个看起来毛茸茸的刺猬毫无办法。       3.VM的一些原理    一个虚拟机引擎由编译器、解释器和VPU Context(虚拟CPU环境)组成,再配上一个或多个指令系统。   编译器:将一条条X86指令解释成自己的指令系统。   解释器:解释器附加在被加壳的软件中,用来解释这些自定义的指令。   指令系统:一套或多套自己定义的指令系统,用来虚拟执行这些bytecode。       在设计VM时提几个建议:   1:设计一个好的、简洁的指令系统是很有必要的,写出越少却能执行最全的指令,就说明这些指令复用性越高。   2:在分析X86指令时最好为它们分类,注意流程指令、不可模仿指令的处理。   3:解释器的代码设计得越少越好,换来的速度可以变形一下。       现在讲讲虚拟机是如何运作的,首先加壳程序先把已知的X86指令解释成了字节码,放在PE文件中,然后将原处代码删掉,   改成类似的代码进入虚拟机执行循环。   push bytecode   jmp  VstartVM       VstartVM是进入虚拟机的函数,它的代码大概类似这样的    [LEFT][LEFT][COLOR=green][FONT=新宋体]// [/FONT][/COLOR][COLOR=green][FONT=新宋体]进入虚拟机函数,我的最初版本是写死在成种VC环境下的,不过这样处理起来很麻烦。[/FONT][/COLOR][/LEFT] [/LEFT] [LEFT][LEFT][COLOR=blue][FONT=新宋体]void[/FONT][/COLOR][FONT=新宋体] [COLOR=blue]_declspec[/COLOR]([COLOR=blue]naked[/COLOR]) [COLOR=#010001]VStartVM[/COLOR]()[/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体]{[/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=blue]_asm[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] {[/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=green]// [/COLOR][/FONT][COLOR=green][FONT=新宋体]将寄存器压入堆栈,由伪指令取出存放到VMReg中[/FONT][/COLOR][/LEFT] [/LEFT] [LEFT][LEFT][COLOR=green][FONT=新宋体] //[/FONT][/COLOR][COLOR=green][FONT=新宋体]可以考虑为压栈时加入一些随机性[/FONT][/COLOR][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]eax[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]ebx[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]ecx[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]edx[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]esi[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]edi[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]push[/COLOR] [COLOR=#010001]ebp[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]pushfd[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]mov[/COLOR] [COLOR=#010001]esi[/COLOR],[[COLOR=#010001]esp[/COLOR]+0x20][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]mov[/COLOR] [COLOR=#010001]ebp[/COLOR],[COLOR=#010001]esp[/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]sub[/COLOR] [COLOR=#010001]esp[/COLOR],0x200[/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]mov[/COLOR] [COLOR=#010001]edi[/COLOR],[COLOR=#010001]esp [/COLOR][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]sub[/COLOR] [COLOR=#010001]esp[/COLOR],0x40[/FONT][/LEFT] [/LEFT] [LEFT][LEFT][COLOR=green][FONT=新宋体]Next:[/FONT][/COLOR][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]movzx[/COLOR] [COLOR=#010001]eax[/COLOR],[COLOR=#010001]byte[/COLOR] [COLOR=#010001]ptr[/COLOR] [[COLOR=#010001]esi[/COLOR]][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]lea[/COLOR] [COLOR=#010001]esi[/COLOR],[[COLOR=#010001]esi[/COLOR]+1][/FONT][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=green]jmp dword ptr [eax*4+JUMPADDR] ;[/COLOR][/FONT][COLOR=green][FONT=新宋体]跳到Handler执行处,由加壳引擎填充[/FONT][/COLOR][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] [COLOR=#010001]VM_END[/COLOR] ;[COLOR=#010001]VM[/COLOR][/FONT][COLOR=#010001][FONT=新宋体]结束标记[/FONT][/COLOR][/LEFT] [/LEFT] [LEFT][LEFT][FONT=新宋体] }[/FONT][/LEFT] [/LEFT] [FONT=新宋体]}[/FONT]   然后每读一个byte跳到目标处模拟执行代码。   JUMPADDR就是一张函数表(让我想到了VTBL),每次从内存里读出一个command code(其实就是偏移),然后转向那个过程,如vEnter的代码:   [LEFT][LEFT]// enter和执行下列代码用途相同[/LEFT] [/LEFT] [LEFT][LEFT]//push ebp[/LEFT] [/LEFT] [LEFT][LEFT]//mov ebp,esp[/LEFT] [/LEFT] [LEFT][LEFT]//sub esp,(L - 1) * 4 ; L > 0才有这步操作,用来存储嵌套的L - 1个子过程的栈框架指针(注意是指针)[/LEFT] [/LEFT] [LEFT][LEFT]//push ebp ; 当前过程的栈框架指针[/LEFT] [/LEFT] //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.注意有时要修正虚拟堆栈寄存器的值,否则会挂得很惨。   [LEFT][LEFT]6.Jmp 到 next,这时转向第2步。[/LEFT] [/LEFT]    [LEFT][LEFT]其他指令如同vEnter一样。。。发挥你的想像力了。[/LEFT] [/LEFT]    [LEFT][LEFT]2-6就是一个虚拟机的执行过程,如果你曾经调试过VM,是否会对jmp [table+x]似曾相识呢?[/LEFT] [/LEFT]     [LEFT][LEFT]一个简单的VM引擎就是这个样子,不过一个专业化、商业化的引擎可不仅是这个样子,还要注重很多东西,比如多线程、流程化指令,虚拟-现实之间的转换,支持SEH异常(包括VB、VC的异常)。[/LEFT] [/LEFT]    [LEFT][LEFT]看到这里,你可以发现,虚拟机就是一层复杂的壳子,把原来的代码藏得毫无踪影,如果你想还原出原来的代码(基于更高级的理论来说,暂时已经不可能了),那么你需要先复习一下IA64,然后仔细研究VM执行体,逆向出Table中用到的函数,得出它正在执行哪一条语句的哪一“部分”。。。除非你要研究的程序达到了一定的价值,不然我想等你弄清楚这个程序如何执行的时候,意义已经不大了。[/LEFT] [/LEFT]     [LEFT][LEFT]4.VM的一些资料(感谢笨笨雄的整理)[/LEFT] [/LEFT]     [LEFT][LEFT]游戏维护上不去,介绍一下虚拟机技术。[/LEFT] [/LEFT]   [LEFT][LEFT]http://bbs.pediy.com/showthread.php?threadid=20792[/LEFT] [/LEFT]   [LEFT][LEFT]【原创】Asprotect 中的 X86 的VM分析 http://bbs.pediy.com/showthread.php?threadid=36245 Asprotect 中的 X86 虚拟机代码分析【原创】 http://bbs.pediy.com/showthread.php?threadid=34135 ExeCryptor v2.X.X虚拟机不完全补完(处女帖) http://bbs.pediy.com/showthread.php?threadid=29537 Themida的VM分析--变形代码清理 http://bbs.pediy.com/showthread.php?threadid=34555 Themida虚拟机简单介绍 http://www.pediy.com/bbshtml/bbs8/pediy8-598.htm Themida v1.8.0.0 Demo虚拟机分析 http://bbs.pediy.com/showthread.php?threadid=36453 寂寞轰炸:再次小窥 VMProtect 虚拟机 http://bbs.pediy.com/showthread.php?threadid=37293 【原创】VMCrackME----A Preliminary Virtual Machine From Top To Bottom http://bbs.pediy.com/showthread.php?...viewgoodnees=1 Defeating HyperUnpackMe2 With an IDA Processor Module http://www.openrce.org/articles/full_view/28[/LEFT] [/LEFT]     [LEFT][LEFT]讨论:[/LEFT] [/LEFT]   [LEFT][LEFT]虚拟机保护技术在未来几年很可能成为主流保护方案,在这里提问几个问题请大家讨论一下:[/LEFT] [/LEFT]   [LEFT][LEFT]1.虚拟机进一步的发展方向是什么?[/LEFT] [/LEFT]   [LEFT][LEFT]2.虚拟机保护的强度怎么样?[/LEFT] [/LEFT]   [LEFT][LEFT]3.虚拟机保护开发难度怎么样?[/LEFT] [/LEFT]   [LEFT][LEFT]4.虚拟机保护优缺点是什么?[/LEFT] [/LEFT]     [LEFT][LEFT]注: 请勿灌水,如“学习”,“强帖必留名”,“打我屁股我不乖”之类的。[/LEFT] [/LEFT]

CTF训练营-Web篇

#VM保护


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3