2012-07-19 66 views
5

對,我在談論桌面應用程序中的許可證驗證碼,例如方法bool ValidateLicense(string licenseCode)。當然,任何保護方案都可以由熟練和堅定的裂解工人逆向工程。但是,我想阻止任何具有一些基本編程知識的人都可以在幾分鐘內使用Reflector構建一個keygen。如何保持.NET程序邏輯(合理)的祕密?

可能的方法

  1. 模糊處理。我的理解是混淆導致性能開銷並可能妨礙(合法的)調試。那麼是否有工具只允許混淆選定的方法?

  2. 將方法移動到ngen'ed程序集或非託管DLL。但是,這不是簡單地替換DLL的邀請嗎?任何想法如何防止這種情況(閱讀:讓攻擊者有點難)?

  3. 其他

PS:問題顯然與Protect .NET code from reverse engineering?試圖把思緒從那裏練

UPDATE

到1之間的第一混淆一步肯定會重新命名的驗證方法。 (謝謝,Jonathan)

至2.假設應用程序使用Win32 API方法,可以通過非託管DLL重新路由調用,從而使它成爲應用程序的組成部分。擺弄方法簽名(例如更改名稱,交換參數)會使這一點變得不那麼明顯。你認爲先天的缺點是合理的嗎?

至3. 請勿分發驗證方法屬於此處。將它保存在你的服務器上並遠程調用,即使用在線驗證(謝謝David Hedlund)

+0

我們決定不使用模糊處理,並使用簡單的許可證密鑰機制和在線激活。當然,這可能是「破解」(事實上是這樣)。我們的計算如下:使用盜版軟件的用戶永遠不會購買該工具,而且我們還可以分發更多的軟件。雖然不夠完美,但還是比較努力保護軟件和編寫好工具的(更好的)「保護」。 – 2012-07-19 07:00:38

+0

使用一個隱蔽的虛擬機,聯機驗證的組合以及使用在線驗證服務提供的隨機VM代碼來處理代碼中的一些重要(但不是性能關鍵的)部分。甚至將部分基本功能(不僅僅是驗證)轉移到在線服務中。 – 2012-07-19 08:13:27

回答

2

Eazfuscator讓你只在發佈時混淆你的代碼,我們使用它不會感覺任何性能問題。它可以讓你混淆選定的方法。請注意,公共方法不能被混淆。 http://www.codeproject.com/Articles/20565/Assembly-Manipulation-and-C-VB-NET-Code-Injection

你應該集簽名,以避免:

喜歡你ValidateLicense任何功能可以通過良好的反射器將返回真爲第一生產線:(我建議你這個articule關於代碼注入的組件很容易地修改修改,但...簽名也可以用propper工具刪除:http://www.nirsoft.net/dot_net_tools/strong_name_remove.html

對不起,但沒有任何技巧可以避免.Net中的逆向工程,你只能讓事情變得更加困難。不要命名你的函數ValidateLicense,並使你的驗證邏輯有點神祕)

+0

沒有任何技巧可以避免對任何不駐留在您自己的服務器上的軟件進行逆向工程。 – 2012-07-19 07:10:31

+1

關於Reflexil的文章令人印象深刻地展示了.NET反射的潛力! (或者從開發人員的角度來看是可笑的); – 2012-07-19 07:17:57

2

許多軟件供應商採用的一種方法是要求在線激活。這樣,密鑰驗證代碼只能在您的服務器上執行,這將使其不易被黑客訪問。

當然,如果黑客知道或可以提取有關此類響應預期外觀的信息,那麼您將引入新的漏洞,將驗證調用簡單地重新路由到發送成功響應的自定義服務器。但是,正如你指出的那樣,總會有人能夠破解你的產品,所以我仍然會說這是一個可行的選擇。針對驗證

+0

對,這是選項3的優點。讓它在企業場景中工作可能會非常棘手,所以也許我會從離線方式開始,並監視我的應用是否真的吸引了破解者。 – 2012-07-19 07:27:05

2

三種可能的攻擊通過去除調用它

  • 反向工程驗證邏輯,揭示合法碼
  • 反向工程驗證邏輯,允許驗證條件通過修改來滿足是

    1. 繞過驗證環境

    一種方法是在您的應用程序的幾個點上驗證許可證 - 這有助於減輕1。代碼混淆有助於緩解2和3 - 但最終這是一個棘手的問題。我的意見是這些方法的組合,可以防止基本的程序員竊取你的程序,但是如果有些東西值得的話 - 那麼有人會這麼做。

  • 0

    我知道這不是答案,但我會建議使用.NET Reactor http://www.eziriz.com/,因爲它已經具有許可(具有各種許可方案)和強大的代碼保護機制。