2009-07-14 76 views
1

我有一個COM inproc DLL,我們正在使用我們的產品。 現在,如果有人發現我們已經從DLL中公開了哪些接口和API,那麼可以輕鬆調用這些API。如何阻止某人調用我的COM接口API?

有沒有辦法阻止未知的應用程序調用我的API?

我們可以在COM中添加一些簽名嗎?

+0

要獲得更多相關答案,您應該指定COM服務器和可能的客戶端使用的語言/技術。 – sharptooth 2009-07-15 06:08:18

+0

我使用C++爲客戶端和服務器 – anand 2009-07-15 11:22:06

回答

3

控制對象使用的正式方法是在創建COM對象的類工廠上實現IClassFactory2。

下面是MSDN上的一個鏈接,解釋接口。

IClassFactory2 at MSDN

創建實現的好處是,沒有人可以不通過IClassFactory2清理登記的障礙獲取一個實例。

缺點是您必須檢查所有創建對象的位置,以確保它們沒有損壞。創建實例變得更加繁瑣,儘管一些語言已經有了一些設備來減少這個過程(例如VB6)。

如果您試圖保護一個具有大量實例化活動的對象,那麼您可能需要使用Mastermind添加關鍵參數的方法,或者添加某種類型的解鎖方法到您必須正確調用的接口在它之後的組件可以被使用之前。

1

沒有什麼能夠阻止你在方法中添加一個「key」參數,如果關鍵是錯誤的,這個方法會返回。

非常簡單,但會爲初學者做。

0

除了某種'關鍵'參數之外,你不能阻止好奇發現你的函數然後調用它。它只需要一個調試器和一些耐心。爲了完全安全起見,您必須要求授權代碼可以獲得的某種證書,但其他所有人都不能這樣做,但這意味着您的代碼必須能夠驗證證書。

2

你可以使你的接口直接從IUnknown繼承(沒有IDispatch)並且不包含類型庫到DLL中。通過這種方式,只有那些有權訪問類型庫的人才能夠找到支持哪些接口,並且唯一的另一種發現接口的方法將只是猜測。如果你這樣做,你可能也希望儘量減少暴露給註冊表的類的數量(可以使用CoCreateInstance()創建的類),並使用一些專門的註冊表公開類的工廠方法集。

這意味着只有vtable早期綁定可以與你的組件一起工作。您也將無法使用此組件的默認呼叫編組(因爲沒有包含類型庫)。這不是真正的保護,只是隱藏事物的一種方式。