Activex控件的IObjectSafety接口問題
阿新 • • 發佈:2017-11-01
login 需要 map roo cati 還要 get tin cal
類似的就可以
HKEY_CLASSES_ROOT\Component
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\Component
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
7DD95801-9882-11CF-9FA9-00AA006C42C4為安全空間的ID。
如果是ATL的工程,很簡單需要在控件中實現IObjectSafety接口,
class CLoginCtl :
.... ,
public IObjectSafetyImpl<CLoginCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
...
BEGIN_COM_MAP(CLoginCtl)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
...
}
或者
BEGIN_CATEGORY_MAP(CLoginCtl)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
msdn http://support.microsoft.com/kb/168371/en-us 07年給啟明星辰做天清漢馬SSLVPN客戶端的時候,當時老孟強烈建議使用mfc的ocx,所以就沒做atl的,當時使用還是vc6,雖然已經有了vc8。
時隔5年之後,我又開始寫SSLVPN客戶端,發現vc6寫的ocx在IE8上經常崩潰,而且還要處理DEP的問題,只能使用atl8之後的版本。
在初始化控件之前,IE會調用IObjectSafety::SetInterfaceSafetyOptions強制ocx處理不信任的數據初始化和調用。
public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA >,
詭異的是vc8,vc9可以執行public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_DISPEX | INTERFACE_USES_SECURITY_MANAGER>,
vc10只能執行public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA >。
http://blog.chinaunix.net/uid-192452-id-3150062.html
我的05年做流氓插件的時候,就註意到了這個問題,只要註冊表加入
類似的就可以
HKEY_CLASSES_ROOT\Component
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\Component
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
7DD95801-9882-11CF-9FA9-00AA006C42C4為安全空間的ID。
如果是ATL的工程,很簡單需要在控件中實現IObjectSafety接口,
class CLoginCtl :
.... ,
public IObjectSafetyImpl<CLoginCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
...
BEGIN_COM_MAP(CLoginCtl)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
...
}
或者
BEGIN_CATEGORY_MAP(CLoginCtl)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
msdn http://support.microsoft.com/kb/168371/en-us 07年給啟明星辰做天清漢馬SSLVPN客戶端的時候,當時老孟強烈建議使用mfc的ocx,所以就沒做atl的,當時使用還是vc6,雖然已經有了vc8。
時隔5年之後,我又開始寫SSLVPN客戶端,發現vc6寫的ocx在IE8上經常崩潰,而且還要處理DEP的問題,只能使用atl8之後的版本。
在初始化控件之前,IE會調用IObjectSafety::SetInterfaceSafetyOptions強制ocx處理不信任的數據初始化和調用。
public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA >,
詭異的是vc8,vc9可以執行public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_DISPEX | INTERFACE_USES_SECURITY_MANAGER>,
vc10只能執行public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA >。
Activex控件的IObjectSafety接口問題