在研究挂马网页的时候,为了获得一个网页调用的ActiveX的函数,想出了如下方法:
Hook CoGetClassObject和CoGetClassObjectFromURL,IE创建AcitiveX的时候都调用这两个函数。
函数原型如下
CoGetClassObjectFromURL(REFCLSID rCLASSID, LPCWSTR szCODE, DWORD dwFileVersionMS, DWORD dwFileVersionLS, LPCWSTR szTYPE, LPBINDCTX pBindCtx, DWORD dwClsContext, LPVOID pvReserved, REFIID riid, LPVOID * ppv)
CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved,REFIID riid, LPVOID FAR* ppv)
其中 rCLASSID 是需要创建的ActiveX,LPVOID FAR* ppv是返回的接口指针,
对于我们感兴趣的ActiveX,我们直接返回自己实现的 IDispatch 接口,脚本要调用ActiveX的函数,都需要调用 IDispatch的 GetIDsOfNames方法来获得函数的Invoke ID,该方法原型如下:
GetIDsOfNames(REFIID riid,
LPOLESTR __RPC_FAR *rgszNames,
UINT cNames,
LCID lcid,
DISPID __RPC_FAR *rgDispId);
其中,rgszNames就是网页将要调用的函数名。
对于从IE不用GUID,而用ProgID调用ActiveX的方法,需要HOOK CLSIDFromProgID和CLSIDFromProgIDEx。