2010-07-18 31 views
2

我有一個我打算髮送給第三方的DLL,我想通過限制它只在特定的USB設備連接時才運行來保護它。 我使用setupapi來獲取設備的序列號(通過調用SetupDiGetDeviceInstanceId())。C++中的USB串行驗證

我想使驗證很難跟蹤,以防有人反編譯DLL。例如,對SetupDiGetDeviceInstanceId的簡單調用是可跟蹤的,如果有人想要使用我的DLL而沒有USB的正確序列,他可以很容易地在彙編代碼中查找我的strcmp,並將if(strcmp(...) == 0)更改爲if(strcmp(...) == 1)

保護我的代碼免受逆向工程的良好(最好是「簡單」)方法是什麼?有可能是一個不同的API(除了setupapi)我可以用它來處理嗎?

在此先感謝!

回答

0

在我看來,這對你來說並不容易,對第三方來說很難。身份證檢查太容易找到和禁用。我會嘗試移動一些必要的,很難弄清楚你的DLL到外部設備的計算。

2

我發現限制這種軟件通常會在晚些時候出現,並且會讓你咬人。尋找一種以「防呆」方式實施它的方法往往被低估,並且也可能會無意中最終令惱人的合法客戶癱瘓產品。更好的做法是提供良好的支持,並頻繁更新。任何保護都可以規避,所以我不會在這方面花費太多時間。

+0

雖然我回答爲OP問及我必須同意安德斯。我們有一個商業SAN只因許可USB密鑰失敗而失敗。當然,我們手邊沒有更換鑰匙。 – 2010-07-19 11:42:13

1

您顯然不能只讀取序列號並將其與已知的良好值進行比較 - 找到並刪除這些值是微不足道的。

爲了使事情變得更加困難,請將序列號的加密散列(例如SHA-256)用於正確序列號的加密散列。確保散列的代碼是內聯生成的,因此在讀取序列號和根據散列值比較進行跳轉之間,會有相當大的「東西」。這不會阻止確定的攻擊者,但它會阻止大多數在調試器中查看代碼並且不願花大量時間對其進行逆向工程的人。

如果您想使事情變得更加困難,請以加密形式存儲一些代碼,並將正確的序列號作爲密鑰。在運行時,讀取序列號並使用它來解密代碼。如果錯誤,結果將是錯誤的代碼,您可以按原樣執行(知道它會很快崩潰並燒燬),或者您可以執行某種校驗和來驗證結果,並且更優雅地失敗(即顯示一個錯誤消息並死)如果代碼沒有正確解密。