-
-
[原创]我与VM的三类接触
-
发表于:
2009-3-23 23:09
14810
-
看到置顶帖的《虚拟机:系统与进程的通用平台》活动时,就很有写点东西的冲动,然而,真提笔的时候,才发觉要写VM,真不知从何谈起
我和VM,其实有三类接触
还是由头说起。VM,第一印象应该是VWARE了,记得那时正沉迷于网络安全技术,又没有刺刀见红的胆量,于是就有人推荐了,用VM自己搭一个环境来YY,当时马上就被VM这个神奇的名字唬住了,一个人不生不熟地捣鼓了很久,终于,VMARE的界面亮了起来——不知道大家还是否记得第一次看到VM里面亮出windows徽标的感觉,那时我只有一个很梦幻的念头,这个VM,难道就是《黑客帝国》里的MATRIX?
然而这个VM没让我梦幻太久,256M的内存,跑两个XP,后果可想而知,一词以蔽之,就是,卡吧死机,加上寸土寸金的40G的硬盘,于是,在又一次卡吧死机之后,我终于恼羞成怒,给VWARE下了逐客令,于是,我与VM的第一类接触就到此结束了
重回VM怀抱,是凭着JAVA的机缘。相信说到java,大家都应该猜到是怎么回事了,当书上写道java程序都是在jvm上跑时,我心里又隐隐浮起那种梦幻的感觉,一次编译到处运行的口号,让我对这个卡吧死机的代言词VM,又有了新一层的崇敬,而且那时又正被C由于与硬件密切相关导致很多不确定弄得焦头烂额,jvm很让我感觉到一种秦始皇统一度量衡的气魄
如果这算是第二类接触的话,那么,我与VM的第二类接触,其实还早于第一类接触,没错,VB6,这个让编程初学者爱不释手又让破解初学者痛不欲生的语言,七拐八绕,也算是半个VM吧
最后一类接触,无它,就是VMP了。第一次接触VMP,是TMD,当我第一次看到一个怪异的jmp替代了熟悉的push时,无论如何也无法与论坛上正讨论得热火朝天的VMP联系在一起,后来前辈轻描淡写地说,这不就是TMD嘛,你最近没上看雪吗?于是面红耳赤地告辞出来,想起刚入手的《加密解密》好像正有VM设计一章,一顿狂翻,哦,这就是VMP,原来如此!感谢看雪,感谢bughoho,感谢所有TV!
不过,对于VMP的破解,仍旧空白一片,邂逅TMD之后,我迷上的,是VM的设计。VMP走的是用最少的指令模拟其它指令的路线,这条路,只可膜拜,不可亵玩,于是,我只是想模拟CPU工作而已。第一个抉择就是,获取指令的结构。bughoho给出的是call handle这种样式,而其它资料却一致推荐swtich,其实我对swtich没有半点好感,关于swtich效率底下的传言一直不绝于耳,而且call handle看起来显得更酷些,然而,一份资料最终为这个抉择落定尘埃;超过一百条case后,swatch会变编译为jmp列的形式
随后开始了不温不火的handle设计。遵循UNIX一个程序完成一个功能的思想,我开始摸索着把一个个熟悉的指令拆得更细些。然而第二个值得困扰的问题出来了,数据的传输。寄存器还好说,但一旦涉及内存,就总会让我有一种需要凭空变出另一片内存的恐惧。一份建议使用writeProcessMemory来模拟内存的资料更令我陷入绝望中。后来我突然发觉,既然只是VM,何必老老实实地一定要真的涉及内存操作呢,用BTYE[]不也很好吗?
往下,我不知道还会遇到什么问题,又会钻入哪些牛角尖出不来,对VM学习的路才刚刚开始,而能收集到的VM资料往往零散而缺乏论证,我想,很多VM的初学者应该和我一样,盼望有那么一本书,一本系统而权威的书,那本书,值得我们望穿秋水。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课