保护代码的N种方法
很多使用.NET开发的朋友都会有一个疑惑,那就是:.NET的程序集在使用msbuild编译的时候,其生成结果是所谓的MSIL(微软中间语言)。这样导致的结果就是程序集很容易反编译,因为MSIL是一个公开的规范。
使用微软提供的ILDASM就可以看到这些代码,如下图
通过另外一个工具:Reflector,则可以更加直观地看到明文的代码
于是乎,就有很多朋友都在寻找代码保护的工具或者解决方案。我个人总结如下几个
1. 代码混淆。(也称为模糊处理),其技术原理是代码重命名,也就是说原先具有含义的方法名称,重命名为毫无意义的(A,B,C 诸如此类)
典型的产品有:Dotfuscator community edition,这是一个集成在VS IDE里面的工具。
大致的使用和效果如下:http://rickie.cnblogs.com/archive/2005/01/09/88894.aspx
社区预览版的功能是有限的
国内也有一些厂商有类似的产品
2. 代码隐藏。因为代码混淆改变了方法签名,在很多时候是有问题的,例如程序集要被其他人使用的时候。因为方法名变成了毫无意义的一些字符,将造成使用者极大的麻烦。也可以导致现有引用程序集的失效。
微软的SLP Code Protector是一个不一样的工具,它可以对方法进行保护,但不改变方法名,只不过,把方法里面的代码全部移动到了一个资源文件中去了
这个工具是微软所谓的SLP的一部分,工具本身是免费的,但免费的时候只能一次性加密三个方法。这一点让人有点恶心。
3. 使用非托管代码 编写核心代码(例如核心算法),然后使用平台交互的方式进行调用。
这一点的原因是非托管代码比较难反编译。
4. 我最后总结一条就是:把代码写得足够复杂,让看的人失去信心,也不失为一种保护方法。嘿嘿
例如微软最近不是公开了.NET Framework的源代码吗?这是多少人哭着喊着要争取的事情啊,但是,其实公布之后又如何呢?有几个人去读呢?
这一个纯粹玩笑,呵呵