虚拟机技术专题讨论
看雪论坛现在没什么技术亮点,为了活跃论坛气氛,应
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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课