2014年8月20日 星期三

.net保护思路

本文是我从零开始学习.net保护一周多得出的结论,中间断续穿插了一些别的任务。
公司的.net壳已经做到了按方法加密的程度,如果想再提升,可以从两个方向着手:

1. 加强代码乱序、混淆
2. 按照DNGuard的思路搞

其实还有一点,就是修复反射漏洞,不过我不确定公司的壳有没有这个漏洞而且这也用不上啥大动作姑且不列。两个方向中第一个方向俺没有研究,第二个方向由于DNGuard的作者很大方说的挺清楚,所以比较明朗,这里简单说一下。
简单来讲,现在稍微好点.net壳和脱壳都走到了JIT层,普通的壳无非就是hook的更深然后检查一些其它hook点是不是被脱壳机搞过了,脱壳机也就是选择更深层的hook点截获JIT层编译的il代码并逃避或破坏壳的检测(反射漏洞又是另一条路,操作简单也比较好防,先放放),总的来讲还是脱壳方占优,公司的壳就在这个层次的初级(目测)。
还有一种路线是整体保护,类似飞信的vm,优点是自己做了.net framework该完成的事情,运行程序不再需要.net framework,所有JIT层的手段都失效了,结合成熟的PE保护方案可以保护的很好。同时缺点很多:

1. 程序的发行拖家带口带上了一整套运行环境必然会大幅度增加发行体积。
2. 被保护方可以使用的功能是有限的,兼容性还不好(就连mono都没把功能搞全)
3. 以我们公司现在的水平,就算抄monollvm,性能估计也达不到.net framework的水平。

其中12点对于公司的产品来讲是硬伤,所以我比较倾向于结合两条保护路线的DNGurad思路。
DNGuard的思路就是.net framework做的事情我包揽一部分。比如说我替换的伪il代码我来JIT编译,正常的il代码交给.net frameworkJIT编译。DNG的另一个独特功能也是这种部分包揽的思路。利用这样的思路DNG对两种保护取长补短,达到了强度、性能与兼容性的平衡,而且实现起来可参考的东西还很多比较可行,是我比较倾向的公司.net壳升级方向。

沒有留言:

張貼留言