能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己先顶下, 别沉了!! 呵呵
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
目前的虚拟机保护有两种:
其一是整体保护,并使.NET程序可以脱离传统的FrameWork运行,比如PostBuild之类的。还有飞信使用的虚拟机技术。强度不大。
其二是代码级别的虚拟机保护。这种保护应该是用自己的虚拟机伪码来替换MSIL指令。那么传统的工具就无法解析了。所谓的虚拟机完成一部分编译,我想就是它自己编译成伪码吧。个人感觉其实现方法是HOOK 或者修改JIT引擎可以做到。对这个方面我也只是略知一二,楼主如果有兴趣可以看看SSCLI相关知识。在这个方面Rick大侠应该是走在最前面的。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢楼上的, 期待和你进一步的探讨!
JIT引擎的话, 只要不断的F11 , 或者下硬断。 是可以追踪到IL指令的编译动作的。 但是我想每个.net内核版本应该差距很大, 不知道如何兼容?! 对脱离FrameWork运行研究不多, 期待和各位探讨!
|
能力值:
( 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指令替换掉,所以部分修改,达到破解者即使得到代码也无法看懂的目的就行了。
个人意见,可能理解上有误,仅供参考。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
楼上的有一定的道理。
个人觉得辅助JIT编译,无非有两个层面的意思。
1>就是楼上说的将JIT得编译机制修改, 让JIT认得我们的IL伪代码。
2>JIT完全不知道我们的IL伪代码存在,只是我们在JIT编译之前, 将伪代码替换成MSIL的真实代码。
以上两点是基于下面的论断
MSIL代码要执行,无非是3楼说过的两种方法。 而重新写一套完整的独立的虚拟机(类似开源的MONO)是何等困难。 远非一些小的机构和商业软件开发商能承受。 所以, 我觉得3楼的第二种方法是可行的。 如果使用2套方案, MSIL代码的执行,必然要被编译成本地代码。 而本地代码的功能又不能因为虚拟机的存在而改变。 所以用伪代码做些手脚, 在JIT真正编译前替换(解密)。
(以上纯属个人观点,还请rick指正!!!!!)
另tease 能否留下联系方式??
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
大侠,你放过我吧,都是我的错,我啥也不懂。
cicistudio@gmail.com
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
tease太过谦了, 纯属技术交流。 还请您多扶持。 呵呵
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
这东西太耗精力,陪女友的时间又要少了,又要被女友骂了..............
我强烈推荐你找Rick,虚拟机方面他是大师,然后再将相关技术分享.
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
where is rick? where is rick?
IL的指令也只有200多条, 远不能和汇编比。 不过机制还比较复杂, 稳定和兼容是大问题。
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
http://bbs.pediy.com/member.php?u=24196
可以搜索他发表的主题,都很经典
http://www.cnblogs.com/rick/
他的博客
如果Rick看到此贴子,出来点拨一下我们啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
tease, 我给你发了邮件, 希望多交流!!!!
|
能力值:
( LV12,RANK:290 )
|
-
-
13 楼
dnguard中的hvm用的是替换部分IL代码,由运行库直接实现这部分伪代码的编译,具体编译实现可以参考sscli,主要是考虑到兼容性所以只替换部分。这种保护,安全性和兼容性是成反比的,替换得越多兼容性就越差。
如果破解者很熟悉JIT底层,能拦截到运行时通过jit的字节码,
即使一大堆字节码中只包含少部分伪码,翻译出来后也基本上是无法理解的了。
通过分析多个版本的框架JIT,可以将IL代码按照各个框架间编译的兼容性进行分类。兼容性很差的可以直接丢给框架处理,兼容性较好的可以按照级别自己处理。dnguard中提供的hvm强度设置,实际上就是控制哪些级别的IL代码替换为伪码由运行库自己编译。
对于方法编译,除了JIT外,还有在ee层中的方法编译预处理。这部分在jit中hook不到的,得在ee中hook。
这部分主要是对方法头的处理,对于保护来说比较有意义的是局部变量和异常表这两部分的处理。
其中异常是有可能改变执行流程的,对于一个方法,如果获取到完全正确的IL代码,但是没有异常表,也可能无法正确分析。获取到的IL代码要翻译成高级代码,这两部分都是必不可少的。
这部分处理在各个版本的框架中基本上都一样,没有怎么变化过,兼容性很好。dnguard就完全接管了这部分,直接在运行库中自己实现了。
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
膜拜啊,感谢Rick大师的指点,我大概了解是怎么一回事了。果然是内核级的加密,太牛X了。什么时候能达到这种境界就好了。我回家闭关啃书去......
搞DONET研究的都出来膜拜啊。真正的大师级别人物来了。 什么时候我们去团购一份dnguard回来
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
还有一点不太明白, HVM和JIT之间有横向沟通么?? 如果各工作各的, 那如果遇到跳转如何处理?
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
等了一天,我居然还是没收到..............
|
能力值:
( LV12,RANK:290 )
|
-
-
17 楼
简单的说,可以看成hvm替换了jit中的部分编译处理过程。
hvm只要按照jit的调用规则处理单个字节码,并按照规则存储返回相应结果即可。
这也可以看着是一种沟通吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
cicistudio@gmail.com 这个邮箱, 又发了一次。 呵呵。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
谢谢Rick ! sscli我还不是太熟, 看来要恶补才行。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
哈哈,最近也在研究SSCLI源码。 个人感觉除LDSTR, LDOBJ等对象操作的指令, 其他的指令还是可以替换编译处理的。 Rick很强, 向你们多学习!
|
|
|