天天看點

[讨論]在.NET下擷取硬碟序列号的問題

一般軟體的注冊機制可以通過擷取硬體序列号,然後用非對稱加密算法生成相應的公鑰和私鑰。但是用Managed Code寫擷取硬碟序列号的代碼不能解決所有的問題,比如不能在非管理者的權限下使用,前幾天Sunmast在他的Blog上釋出了《如何得到硬碟序列号?.NET版本[C#]》,就是沒有解決這個問題,用WMI也有很多問題。

要想順利擷取硬碟的序列号,目前隻能依靠非托管代碼了。DiskId32是一個源碼公開的C++程式,可以解決上述問題。由于代碼比較底層,我對VC和DDK不熟悉,沒有能力将其封裝為DLL,希望各位幫忙!

還有,就算封裝好了這個Native DLL并可以使用了,但還有問題沒有解決

[讨論]在.NET下擷取硬碟序列号的問題

。如果封裝到了Native DLL,該DLL很容易被人替換成另外一個,畢竟在Managed Code裡面可以看到調用Native DLL的函數聲明,别人隻要模仿這些函數界面重新寫一個新的就很容易達到破解目的了。不過具體我沒有測試過,不知道行不行。

于是我又想到了另外一個方法,就是把擷取硬碟序列号的Native DLL作為資源檔案封裝到Managed Code中,然後在每次要調要該DLL時,先把該DLL寫入磁盤,再動态綁定。由于Managed Code可以通過混淆器來保護,以緻不能對其進行修改,這個我在《如何保護我們的 .NET 程式集?》中已經給出了答案。動态綁定Native DLL又是另外一個技術難題,我已經找到了一些資料,與大家分享

[讨論]在.NET下擷取硬碟序列号的問題

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程式的保護問題,找出最好的解決方案!

繼續閱讀