zoukankan      html  css  js  c++  java
  • ie编程 webbrowser hook activex控件

    问题背景:
    在使用HOOK来监视IE进程时,可以捕获到一些普通的DLL调用,比如loadLibrary(mshtml.dll)等。

    问题描述:
    当IE使用activeX时,在网页中一般这样写<object id=some classid="clsid:xxxxxxxxxx"></object>
    与此同时,ie“应该是”去获取clsid在注册表中所对应的dll,然后装载它,比如这个clsid对应的是 pp.dll
    问题1 我根本捕获不到LoadLibraryA(或W 或ExA或ExW)pp.dll的行为,为什么?(换句话说,ie用什么操作来装载ACTIVEX)

    问题2 activeX pp.dll这个东西一般会有个DllGetObjectClass,他返回类工厂用来CreateInstance, hook它没有效果呀。
    比如pp.dll暴露的接口只有DllUnloadxxx DllGetObjectClass ,一般而言只能勾他们,勾不住类工厂创建的实例里的函数,
    难道非得勾住DllGetObjectClass 然后记录下类工厂,再勾住类工厂的CreateInstance,然后修改它返回的instance里面的虚函数表,然后再勾??

    经实验,ie是使用CoGetClassObject获得类工厂
    然后调用类工厂的CreateInstance
    然后从获得的实例当中在调用方法
    如果想hook 必须这三个方法都得hook住
    尤其后两个,注意编译的时候要加CINTERFACE编译项,好让vptr指针暴露出来。
    例子可以看msra出品的detours的第一个例子,好像叫commem。

    hook代码:

    获取要hook的模块:

            HMODULE ole32 = GetModuleHandle(_T("ole32.dll"));
            if (!ole32)
                ole32 = LoadSystemLibrary(_T("ole32.dll"));
    
            if (ole32)
            {
                RealCoGetClassObject = (PROC_CoGetClassObject)GetProcAddress(ole32, "CoGetClassObject");
                if (RealCoGetClassObject)
                    DetourAttach(&(PVOID&)RealCoGetClassObject, HookedCoGetClassObject);
    }

    实现hook后的处理方法:

    HRESULT WINAPI HookedCoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved, REFIID riid, LPVOID FAR* ppv)
    {
        TCHAR szVal[MAX_PATH + 1] = { 0 };
        DWORD dwType = REG_SZ, cbData = MAX_PATH;
    #if 1//打印object 对象的 classid
        {
        LPOLESTR lplpsz;
        StringFromCLSID(rclsid, &lplpsz);
        DUITRACE(L"xdbrclsid:%s", lplpsz);
        }
    #endif
        if (IsEqualCLSID(CLSID_MediaPlayer, rclsid))
        {
            ::SHGetValue(HKEY_CLASSES_ROOT, _T("CLSID\{6BF52A52-394A-11d3-B153-00C04F79FAA6}\InprocServer32"), _T(""), &dwType, szVal, &cbData);
            if (szVal[0])
            {
                CString strFile(szVal);
                ::ExpandEnvironmentStrings(strFile, szVal, MAX_PATH);
                if (!::PathFileExists(szVal))
                    return REGDB_E_CLASSNOTREG;
    
                static TCHAR szVer[64] = { 0 };
                if (!szVer[0])
                    GetFileVersion(szVal, szVer, SIZEOF(szVer) - 1);
                if (CompareVersion(szVer, _T("11.0.0.0")) >= 0)
                {
                    ::PathRemoveFileSpec(szVal);
                    ::PathAppend(szVal, _T("MFPlat.dll"));
                    if (!::PathFileExists(szVal))
                        return REGDB_E_CLASSNOTREG;
                }
    
                ::PathRemoveFileSpec(szVal);
                ::PathAppend(szVal, _T("wmploc.dll"));
                if (!::PathFileExists(szVal))
                    return REGDB_E_CLASSNOTREG;
            }
        }else if (IsEqualCLSID(CLSID_HHCtrl, rclsid))
        {
            LPOLESTR lplpsz;
            StringFromCLSID(rclsid, &lplpsz);
            DUITRACE(L"xdbrclsid:%s", lplpsz);
            TCHAR szVal[MAX_PATH + 1] = { 0 };
            DWORD dwType = REG_SZ, cbData = MAX_PATH;
            ::SHGetValue(HKEY_CLASSES_ROOT, _T("CLSID\{52A2AAAE-085D-4187-97EA-8C30DB990436}\InprocServer32"), _T(""), &dwType, szVal, &cbData);
            if (szVal[0])
            {
                DUITRACE(L"xdbrclsid:%s", szVal);
            }
        }else if(IsEqualCLSID(CLSID_iWebOffice, rclsid))
        {
            LPOLESTR lplpsz;
            StringFromCLSID(rclsid, &lplpsz);
            DUITRACE(L"xdbrclsid:%s", lplpsz);
            TCHAR szVal1[MAX_PATH + 1] = { 0 };
            DWORD dwType = REG_SZ, cbData = MAX_PATH;
            //                                    CLSID\{D89F482C-5045-4DB5-8C53-D2C9EE71D024}\InprocServer32
            ::SHGetValue(HKEY_CLASSES_ROOT, _T("CLSID\{D89F482C-5045-4DB5-8C53-D2C9EE71D025}\InprocServer32"), _T(""), &dwType, szVal1, &cbData);
            if (szVal1[0])
            {
                DUITRACE(L"xdbrclsid:%s", szVal1);
            }
        }
        else if (IsEqualCLSID(CLSID_saxfileBAD, rclsid) || IsEqualCLSID(CLSID_shiyouBAD, rclsid) )
        {
            //url is ..
            return REGDB_E_CLASSNOTREG;
        }
    
        HRESULT hr = REGDB_E_CLASSNOTREG;
        if (hr != S_OK)
            hr = RealCoGetClassObject(rclsid, dwClsContext, pvReserved, riid, ppv);
    
    
        return hr;

    判断classid的值:

    //classid=clsid:230C3D02-DA27-11D2-8612-00A0C93EEA3C
    const CLSID CLSID_saxfileBAD = { 0x230C3D02, 0xDA27, 0x11D2,{ 0x86, 0x12, 0x00, 0xa0, 0xc9, 0x3e, 0xea, 0x3c } };
    //{62B4D041 - 4667 - 40B6 - BB50 - 4BC0A5043A73}
    const CLSID CLSID_shiyouBAD = { 0x62B4D041, 0x4667, 0x40B6,{ 0xbb, 0x50, 0x4b, 0xc0, 0xa5, 0x04, 0x3a, 0x73 } };
  • 相关阅读:
    使用Docker搭建Wordpress
    Django开发Web页面html增加判断展示
    Python如何取小数点位数
    html内容可编写
    MySQL 设置 非空约束依然能插进去的办法
    Git拉取远程所有分支
    my.ini 配置文件
    node
    TP upload 上传根目录不存在
    linux 安装 memcache
  • 原文地址:https://www.cnblogs.com/bigben0123/p/14434885.html
Copyright © 2011-2022 走看看