极品懒人

导航

保。,net .

 我们都在寻找,花很长一段时间寻找。一种可以完全保护代码安全的做法。用了无数种工具,无数种方案。在强大的IL和反编译,脱壳下,矛下还是刺穿了盾。

  最近作者也一直头痛这件事,不过结合了以前的一些解决办法。又想出来了一种新的方案。

  OK,长话短说,做法相当简单。

  网上大多数加壳的方式是将程序或库放入资源,然后以读取资源来运行。这种方法好是好,可是,当这层壳被攻破之后,代码依然暴露无疑。

  我的做法其实与上面的方法比较类似,不过,我是将程序或库用IO的方式直接生成2进制码,再将这种码生成一个byte[]数组(很简单啦,就是用FileStreamReader读,然后再用StreamWriter写嘛,写的时候加工一下啦)存放于.cs文件中(我是直接生成了一个CS文件)。然后将该文件复制粘贴到工程中。在这个过程中,我们还可以对这个.cs文件中的,byte[]进行加工,让这些二进制码更短,更难破译。

  然后生成一个控制台程序(别的也可以),使用AppDomain.Load(byte[])方法进行加载,并运行。

  嗯。。。这样一个带壳的程序就做好了。不过,有朋友在试过之后,可能会很头痛,这样的方法只能加载一个程序,并不能包含程序中所需要用到的其它dll和资源文件。怎么办呢?

  嘿嘿,很简单啦。将资源和文件按以上方式同样生成为byte[],然后使用AppDomain中的AssemblyResolve事件,将未能加载的Assembly加载上,便能正确使用了。

  经过测试,所有程序,包括Remoting等都能正确运行。不过有个小问题,就是序列化后存于硬盘文件中的对象不能正确使用。作者也正在研究呀,相信不久之后会有更好的解决办法。

  这个办法同样适用于经过其它工具混淆和加壳后的exe和dll,而且在生成之后还可以再次混淆和加壳,在反编译这种程序后,只能看到一大堆读不懂的01码,而且在IL中也同样如此。大家不防一试

posted on 2011-12-13 21:09  极品懒人  阅读(243)  评论(0编辑  收藏  举报