2012-03-07 74 views
2

需要保護某些程序集免於修改(換句話說,如何確定程序集編譯後是否修改了程序集二進制文件)。我怎麼能通過內置的.NET手段在.NET 4.0中實現這一點?如何保護修改的C#代碼

問題只出在DLL文件修改檢測,而不是防止反編譯,逆向工程等。

回答

2

您可以我們強名稱程序集(見HERE)。
他們有一個公鑰和附加數字簽名,一旦他們被改變,他們將不會被JIT了加載:

強名稱提供了有力的完整性檢查。通過.NET 框架安全檢查保證程序集 的內容自構建以來未被更改。

但是作爲史蒂夫提到它並不是絕對安全!

+0

這隻適用於主程序集(.exe)未更改的情況。 – 2012-03-07 16:02:00

0

我建議在編譯時做一個哈希程序集。將它存儲在應用程序的某個位置,並在運行時用程序集的新計算散列進行檢查。

由於@Steve建議(和其他人)使用這個過程被稱爲「強命名程序集」

+0

這是強名的全部目的。 – Steve 2012-03-07 15:52:19

+2

修改後,你怎麼知道它是你的(原始)散列? – 2012-03-07 15:53:09

+0

啊謝謝史蒂夫從來沒有新的「強名簽名」! – RvdK 2012-03-07 15:54:46

0

Strong name signing your DLL並使用您的引用(包括簽名)的完全限定名稱應該有助於此。

這不是傻瓜式的 - 有人可以隨時反彙編DLL,但也可以反彙編使用它的任何其他應用程序,並將這些引用更新爲其新版本的DLL。

3

不幸的是,強名稱爲消費者提供保護。它們對程序集的開發者沒有保護,他們的代碼沒有被修改過。這對remove a strong name是微不足道的。一旦刪除它可以根據需要進行修改。

即使提供給消費者的保護也受到強名的限制。由於沒有公共密鑰的中央註冊表,因此無法知道該程序集是否由特定發佈者簽名。黑客可以在修改後更改簽名並使用自己的密鑰進行簽名。事實上,強名稱實際上只能防止黑客修改系統運行時庫......即使如此,我也不確定它們對系統的實際攻擊有多有效。

由於代碼可以是easily modified,即使強命名,在您自己的代碼中添加某種簡單的哈希檢查也不會提供任何額外的保護。有任何希望的唯一方法是使用專業級software protection tool,提供tamper detection