首页
社区
课程
招聘
[求助]关于.net的虚拟机保护
发表于: 2009-8-25 09:20 11267

[求助]关于.net的虚拟机保护

2009-8-25 09:20
11267
偶然看到一款壳, 支持.net的虚拟机保护功能。   它宣称内核编译的时候, 虚拟机完成一部分编译的功能。  有熟悉的大侠,  能简单介绍下该功能的原理么?   小弟在此先谢过了!!!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己先顶下, 别沉了!! 呵呵
2009-8-25 11:14
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
目前的虚拟机保护有两种:
其一是整体保护,并使.NET程序可以脱离传统的FrameWork运行,比如PostBuild之类的。还有飞信使用的虚拟机技术。强度不大。

其二是代码级别的虚拟机保护。这种保护应该是用自己的虚拟机伪码来替换MSIL指令。那么传统的工具就无法解析了。所谓的虚拟机完成一部分编译,我想就是它自己编译成伪码吧。个人感觉其实现方法是HOOK 或者修改JIT引擎可以做到。对这个方面我也只是略知一二,楼主如果有兴趣可以看看SSCLI相关知识。在这个方面Rick大侠应该是走在最前面的。
2009-8-26 02:11
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的, 期待和你进一步的探讨!

JIT引擎的话, 只要不断的F11 , 或者下硬断。 是可以追踪到IL指令的编译动作的。 但是我想每个.net内核版本应该差距很大, 不知道如何兼容?!  对脱离FrameWork运行研究不多, 期待和各位探讨!
2009-8-26 10:01
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
DONET 1.1 和 2.0版本内核相差较大。
而2.0以后的版本内核几乎是没有变化的。个人认为不需要兼容,直接放弃1.1版本就好,由于性能问题,现在很少有BT公司还在用1.1开发软件。

跟踪JIT引擎的确可以获得IL指令,但是用于虚拟机技术保护的软件,截获的部分指令不是微软传统上的IL指令,而是作者自己定义的一套指令系统。你要知道,DONET自己本身就是虚拟机,如果我能将其JIT的编译机制修改,那么就可以编译自己定义的指令了。我想作者宣传无法获得IL代码的意思,应该是无法获得标准的MSIL代码,任何代码都获不到,是不太现实的事情。至少可以获得经过作者伪码后的代码。

作者的JIT虚拟机系统为什么只完成一部分编译的功能,我个人认为是因为微软的JIT系统过于庞大,即使修改,也不可能将所有的IL指令替换掉,所以部分修改,达到破解者即使得到代码也无法看懂的目的就行了。

个人意见,可能理解上有误,仅供参考。
2009-8-26 10:44
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上的有一定的道理。

个人觉得辅助JIT编译,无非有两个层面的意思。

1>就是楼上说的将JIT得编译机制修改, 让JIT认得我们的IL伪代码。

2>JIT完全不知道我们的IL伪代码存在,只是我们在JIT编译之前, 将伪代码替换成MSIL的真实代码。

以上两点是基于下面的论断

MSIL代码要执行,无非是3楼说过的两种方法。 而重新写一套完整的独立的虚拟机(类似开源的MONO)是何等困难。 远非一些小的机构和商业软件开发商能承受。 所以, 我觉得3楼的第二种方法是可行的。 如果使用2套方案, MSIL代码的执行,必然要被编译成本地代码。  而本地代码的功能又不能因为虚拟机的存在而改变。 所以用伪代码做些手脚, 在JIT真正编译前替换(解密)。

(以上纯属个人观点,还请rick指正!!!!!)
另tease 能否留下联系方式??
2009-8-26 11:36
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
大侠,你放过我吧,都是我的错,我啥也不懂。

cicistudio@gmail.com
2009-8-26 11:47
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
tease太过谦了, 纯属技术交流。  还请您多扶持。 呵呵
2009-8-26 11:50
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
这东西太耗精力,陪女友的时间又要少了,又要被女友骂了..............

我强烈推荐你找Rick,虚拟机方面他是大师,然后再将相关技术分享.
2009-8-26 11:55
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
where is rick?  where is rick?  

IL的指令也只有200多条, 远不能和汇编比。 不过机制还比较复杂, 稳定和兼容是大问题。
2009-8-26 12:09
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
http://bbs.pediy.com/member.php?u=24196
可以搜索他发表的主题,都很经典

http://www.cnblogs.com/rick/
他的博客

如果Rick看到此贴子,出来点拨一下我们啊。
2009-8-26 12:42
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
tease, 我给你发了邮件, 希望多交流!!!!
2009-8-26 13:04
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
13
dnguard中的hvm用的是替换部分IL代码,由运行库直接实现这部分伪代码的编译,具体编译实现可以参考sscli,主要是考虑到兼容性所以只替换部分。这种保护,安全性和兼容性是成反比的,替换得越多兼容性就越差。

如果破解者很熟悉JIT底层,能拦截到运行时通过jit的字节码,
即使一大堆字节码中只包含少部分伪码,翻译出来后也基本上是无法理解的了。

通过分析多个版本的框架JIT,可以将IL代码按照各个框架间编译的兼容性进行分类。兼容性很差的可以直接丢给框架处理,兼容性较好的可以按照级别自己处理。dnguard中提供的hvm强度设置,实际上就是控制哪些级别的IL代码替换为伪码由运行库自己编译。

对于方法编译,除了JIT外,还有在ee层中的方法编译预处理。这部分在jit中hook不到的,得在ee中hook。
这部分主要是对方法头的处理,对于保护来说比较有意义的是局部变量和异常表这两部分的处理。
其中异常是有可能改变执行流程的,对于一个方法,如果获取到完全正确的IL代码,但是没有异常表,也可能无法正确分析。获取到的IL代码要翻译成高级代码,这两部分都是必不可少的。

这部分处理在各个版本的框架中基本上都一样,没有怎么变化过,兼容性很好。dnguard就完全接管了这部分,直接在运行库中自己实现了。
2009-8-26 23:55
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
膜拜啊,感谢Rick大师的指点,我大概了解是怎么一回事了。果然是内核级的加密,太牛X了。什么时候能达到这种境界就好了。我回家闭关啃书去......

搞DONET研究的都出来膜拜啊。真正的大师级别人物来了。   什么时候我们去团购一份dnguard回来
2009-8-27 10:31
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
还有一点不太明白, HVM和JIT之间有横向沟通么??  如果各工作各的, 那如果遇到跳转如何处理?
2009-8-27 13:18
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
等了一天,我居然还是没收到..............
2009-8-27 21:42
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
17
简单的说,可以看成hvm替换了jit中的部分编译处理过程。
hvm只要按照jit的调用规则处理单个字节码,并按照规则存储返回相应结果即可。
这也可以看着是一种沟通吧。
2009-8-27 22:27
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
cicistudio@gmail.com   这个邮箱, 又发了一次。 呵呵。
2009-8-28 08:27
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢Rick ! sscli我还不是太熟, 看来要恶补才行。
2009-8-28 08:29
0
雪    币: 21
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
哈哈,最近也在研究SSCLI源码。 个人感觉除LDSTR, LDOBJ等对象操作的指令, 其他的指令还是可以替换编译处理的。  Rick很强, 向你们多学习!
2009-11-9 09:35
0
游客
登录 | 注册 方可回帖
返回
//