一般软件的注册机制可以通过获取硬件序列号,然后用 非对称加密算法 生成相应的 公钥 和 私钥 。但是用Managed Code写获取硬盘序列号的代码不能解决所有的问题,比如不能在非管理员的权限下使用,前几天Sunmast在他的Blog上发布了《 如何得到硬盘序列号?.NET版本[C#] 》,就是没有解决这个问题,用WMI也有很多问题。
要想顺利获取硬盘的序列号,目前只能依靠非托管代码了。 DiskId32 是一个源码公开的C++程序,可以解决上述问题。由于代码比较底层,我对VC和DDK不熟悉,没有能力将其封装为DLL,希望各位帮忙!
还有,就算封装好了这个Native DLL并可以使用了,但还有问题没有解决。如果封装到了Native DLL,该DLL很容易被人替换成另外一个,毕竟在Managed Code里面可以看到调用Native DLL的函数声明,别人只要模仿这些函数界面重新写一个新的就很容易达到破解目的了。不过具体我没有测试过,不知道行不行。
于是我又想到了另外一个方法,就是把获取硬盘序列号的Native DLL作为资源文件封装到Managed Code中,然后在每次要调要该DLL时,先把该DLL写入磁盘,再动态绑定。由于Managed Code可以通过混淆器来保护,以致不能对其进行修改,这个我在《
如何保护我们的 .NET 程序集?
》中已经给出了答案。动态绑定Native DLL又是另外一个技术难题,我已经找到了一些资料,与大家分享。
Late binding on native DLLs with C#
Late-Binding DLLs in C#
Using legacy plug-ins with .NET - Part 1
Using legacy plug-ins with .NET - Part 2
C-Function pointer for .NET
Dynamic PInvoke method calls
不过最牛的就是下面这一招了!直接把Native Code用字节数组保存在Managed Code中,然后调用,真是牛B,不过我还没有完全弄懂,希望大家来实践实践。
Execute Native Code From .NET
另外还有一篇文章是关于加密字符串的,值得研究!
Poly-Engine Crypt String
希望各位多多交流.NET程序的保护问题,找出最好的解决方案!