簡體   English   中英

如何防止他人在C#應用程序中使用我的非托管DLL?

[英]How can I prevent others from using my unmanaged DLL in their C# application?

我正在開發一個C#應用程序來幫助閱讀和寫作殘疾人 - 除此之外,這個應用程序提供了單詞預測。

單詞預測是用C語言編寫的,在Linux服務器上作為Web服務運行,需要使用登錄。 沒問題。

然而,最近,我們的一些客戶表達了對離線版本的興趣,這是我們想要提供的。 作為一種手段,我在單詞預測代碼周圍編寫了一個包裝器(在C中)並將其編譯為一個DLL,我可以在我的C#應用​​程序中使用它和我們的預測數據文件。

問題是,現在每個人都可以訪問:

  1. 我們的數據文件(本身不是問題,因為沒有預測代碼,文件真的沒有意義)。
  2. 編譯的DLL。
  3. C#代碼(可以很容易地反編譯以查看DLL的使用方式)。

我知道我不能保護C#代碼,我也知道完全保護代碼是不可能的,因為二進制文件總是可讀的(這個主題已經有很多問題/答案,所以我會感謝如果人們不重復這些答案)。

但是,我想知道是否有可能以只能從我的應用程序調用DLL的方式保護DLL?

我正在考慮將調用EXE文件的校驗和與編譯到DLL中的校驗和進行比較。 是否有其他(更優雅)的解決方案?

關鍵是不要創建一個100%安全的DLL來防止被非預期的應用程序使用(因為它是不可能的) - 但足夠安全,其他開發人員不能輕易復制數據/ DLL文件並在他們的應用程序中使用它們(我們已經競爭對手已經在其他平台上竊取我們的代碼存在問題。

澄清問題的預期目的

根據一些評論,我認為需要做出一些澄清。

問題的關鍵在於找不到100%安全代碼的方法 - 我們已經知道這是不可能的(這里有一個關於這個主題的好問題: 保護.NET代碼免受逆向工程? )。

關鍵是要獲得關於破解代碼復雜化的方法的建議(或者,正如我所知,現在:通過默默無聞的安全性)。

有些人會認為這是浪費時間,但通過這種思考我們不妨免費向所有人發布所有源代碼,因為它最終會被破解,對吧? 對?

不,這取決於您的目標受眾。

如果你是微軟試圖用它的成千上萬的用戶來防止盜版,那么有人會找到破解它的方法 - 即使只是因為“破解Windows的人”的“威望”。 無論如何,制定一些反盜版措施仍然有意義,只是為了防止普通用戶盜版。

但是,如果您是一家小型企業,那么破解代碼會使其變得更加復雜的行為可能意味着它實際上不會被破解。 為什么? 因為它更加不可能平均喬(和他的朋友們開發)有知識,破解你的密碼,誰可以破解它會沒有興趣的人。

對於直接安全

最簡單的方法是使您的非托管C DLL具有內置的許可機制,從根本上使它對第三方開發人員無用,否則他們可能會將庫導入到他們自己的托管或非托管代碼中。

有許多技術可以做到這一點,例如從Windows注冊表中讀取許可證密鑰,或者向DLL添加特殊的ActivateLicense(string key)函數,該函數在使用庫的其他功能之前從C#托管應用程序調用。

生成和接受許可密鑰的具體過程取決於您,但在純脫機環境中,沒有100%安全系統( 如何生成軟件許可證密鑰? )。

通過Obscurity實現額外安全

這些剩余的選項只是額外的提示和技巧,使競爭對手更難以進行逆向工程,但不提供真正的安全性:

  • 將非托管DLL作為資源嵌入托管應用程序中,並在運行時從臨時文件加載它
  • 在嵌入之前加密非托管DLL,在運行時解密,並在卸載應用程序時將其刪除
  • 為您的C#代碼使用第三方混淆工具

由於您只關心普通用戶盜用您的產品,我建議您查看像flexlm這樣的許可證管理器。 只需確保dll本身連接​​到許可證服務器,以確保產品已獲得許可,而不是exe。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM