首页
社区
课程
招聘
[专题]虚拟机技术专题讨论
发表于: 2007-7-7 10:22 56177

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

2007-7-7 10:22
56177

虚拟机技术专题讨论



  

看雪论坛现在没什么技术亮点,为了活跃论坛气氛,应

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直播授课

收藏
免费 7
支持
分享
最新回复 (50)
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
学习学习 加密的发展方向~
2007-7-7 10:50
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
怎么段的时间出了好几篇精华了啊.值得学习
2007-7-7 11:27
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
学习学习!好文章。
2007-7-7 11:49
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
5
要写出自己的指令系统``有难度!
首先加壳程序先把已知的X86指令解释成了字节码,放在PE文件中,然后将原处代码删掉,

那为什么加了vm的壳程序体积会变大?
2007-7-7 12:10
0
雪    币: 1946
活跃值: (278)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
6
因为VM的代码放在新节之中,存放了一些壳代码和数据,理所当然会大一点了.

在写出自己的指令系统应该不算是有难度,而是体力活.
2007-7-7 12:12
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
我觉得商业化的本地软件保护技术,会随着法律的健全和网络普及和带宽的提高最终消失。
最后变成少数人的玩具。
VM以牺牲性能为代价换取保护。有些时候是不可接受的。只有在一些特殊的领域才能应用。
2007-7-7 12:15
0
雪    币: 212
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
如果把VM技术看成是一种单向加密技术,就是说从OPCODE还原成原始代码比较困难,而计算机加密的过程相对简单的话,那么,如果能够拿到加密引擎,尝试对不同的X86指令进行OPCODE变换,得到一张X86指令与OPCODE的对应表,通过查表的方式还原X86指令。因为X86指令的有限性,虽然这张表会很大,但这时可以用程序加以比对,时间复杂度不会太大。不知道这种方法是否可行。

btw我是在胡说,期待板砖
2007-7-7 13:06
0
雪    币: 1946
活跃值: (278)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
9
我觉得商业化的本地软件保护技术,会随着法律的健全和网络普及和带宽的提高最终消失。
最后变成少数人的玩具。
VM以牺牲性能为代价换取保护。有些时候是不可接受的。只有在一些特殊的领域才能应用。

法律 网络问题我想现在暂时还不用考虑吧...
VM在的确是牺牲性能来换取保护,导致应用面不是100%的适用.
如游戏等这些追求速度的程序.

如果把VM技术看成是一种单向加密技术,就是说从OPCODE还原成原始代码比较困难,而计算机加密的过程相对简单的话,那么,如果能够拿到加密引擎,尝试对不同的X86指令进行OPCODE变换,得到一张X86指令与OPCODE的对应表,通过查表的方式还原X86指令。因为X86指令的有限性,虽然这张表会很大,但这时可以用程序加以比对,时间复杂度不会太大。不知道这种方法是否可行。

这种方法对毫无防范的VM来说还可以,但是现有的VM基本不可取,因为OPCODE每次生成的OPCODE都是不同的,有的甚至加密、变形了。
2007-7-7 13:30
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
10
说起来vm还真是牺牲性能来换取保护!
2007-7-7 14:02
0
雪    币: 212
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我被教育过了,不发表任何意见。没有完美的保护。
2007-7-7 14:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
向楼主学习啊~~~
2007-7-7 15:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
可不可以这样理解:虚拟技术就是针对每条最原始的机器码指令而用类似于暗号或者报文密码之类的“乱码"来替代.针对把机器玛变成"乱码"和把"乱码"还原成机器码而设计出加密器和解码器.汇编时就让加密器把机器码变成"乱码"然后在执行时再用解码器把"乱码"还原成机器码.可否正确?
2007-7-7 15:05
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
14
支持~你们讨论我来学习
2007-7-7 17:27
0
雪    币: 623
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
成长中的巨人
VM
LZ

想像一下,WINRAR 为保护关键的压缩代码而使用VM。
:-)
2007-7-8 23:59
0
雪    币: 397
活跃值: (402)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
16
从商业角度看,VM办法或许也值了,毕竟目的是出于被保护。
2007-7-10 09:08
0
雪    币: 311
活跃值: (139)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶一个,学习ing.
2007-7-11 02:06
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
18
除了VM还有另外一些在效率和复杂度更平衡的方法
2007-7-11 10:27
0
雪    币: 210
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
BUG兄啥时候给我来个专业训练吧,,嘿嘿
2007-7-13 17:18
0
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
你们研究好了 我直接拿来用了 = =
2007-7-14 13:38
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
21
一边提高保护的强度,另一边却是在提倡开源。。。

其实开源是最强的保护~
2007-7-19 14:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
由于其执行速度,应该不可能大规模运用。
但在注册算法部分使用后,会给逆向分析带来极大的困难
2007-7-21 10:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
貌似Java的工作原理
2007-7-21 20:36
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
向LZ学习
2007-7-22 19:54
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
请教楼主一个问题,<<编译原理实践>>这本书 中的 tiny c 和 tm 可以做为开发虚拟机的蓝本吗?
2007-7-25 09:08
0
游客
登录 | 注册 方可回帖
返回