首页
社区
课程
招聘
[求助]关于COM对象来读写注册表的问题
发表于: 2014-11-17 12:41 4963

[求助]关于COM对象来读写注册表的问题

2014-11-17 12:41
4963
在win7,有UAC的情况下,编辑HKEY_LOCAL_MACHINE健下的项会被UAC拒绝。我想通过一个提权的com对象来编辑注册表。我在网上找到的一个com接口 IWshShell可以编辑注册表,参考020K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0S2K9h3E0W2i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6$3K9h3g2%4i4K6u0r3x3e0p5K6z5o6t1%4x3g2)9J5k6h3S2@1L8g2)9K6c8X3k6J5i4K6y4p5j5h3I4S2k6r3c8A6L8R3`.`.

提权代码如下,结果CoGetObject总是返回0x80080017 。不知道是什么原因,请教高手解答

const wchar_t MONIKER_NAME[] = L"Elevation:Administrator!new:%s";
HRESULT CoCreateInstanceAsAdmin(HWND hwnd, LPWSTR wstrRclsid, REFIID riid, void **ppv)
{
        BIND_OPTS3 bo;
       
        wchar_t wszMonikerName[300];
       
     
        wsprintfW(wszMonikerName, MONIKER_NAME, wstrRclsid);
        memset(&bo, 0, sizeof(bo));
        bo.cbStruct = sizeof(bo);
        bo.hwnd = hwnd;
        bo.dwClassContext = CLSCTX_LOCAL_SERVER;
        if (IsRunningInWin64())
                bo.dwClassContext |= CLSCTX_ACTIVATE_32_BIT_SERVER;
        return CoGetObject(wszMonikerName, &bo, riid, ppv);
}

void CRemoteDlg::OnOK()
{
    LPVOID pRet;
    char lpOut[50];
        GUID Guid;
    CoInitialize(0);
        LPCTSR2GUID("41904400-BE18-11D3-A28B-00104BD35090",Guid);
        CoCreateInstanceAsAdmin(NULL,L"{00020424-0000-0000-C000-000000000046}",Guid,(LPVOID*)&pRet);
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
GUID Guid;
    CLSID rclsid;
    IID  riid;
    CoInitialize(0);
    HRESULT hr1=CLSIDFromProgID(L"WScript.Shell.1",&rclsid);
    HINSTANCE hdllInst =LoadLibrary("wshom.ocx");
    typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);   
    pfnGCO fnGCO = NULL;  
    fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject");
    IClassFactory* pcf = NULL;  
    HRESULT hr=(fnGCO)(rclsid, IID_IClassFactory, (void**)&pcf); //创建工厂  
    LPVOID pvObject;
    IIDFromString(L"{F935DC21-1CF0-11D0-ADB9-00C04FD58A0B}",&riid);
//        LPCTSR2GUID("F935DC21-1CF0-11D0-ADB9-00C04FD58A0B",riid);
    pcf->CreateInstance(0,riid,&pvObject);
    CoCreateInstanceAsAdmin(NULL,rclsid,riid,&pvObject);

const wchar_t MONIKER_NAME[] = L"Elevation:Administrator!new:%s";
HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, void **ppv)
{
        BIND_OPTS3 bo;
        wchar_t wszCLSID[50];
        wchar_t wszMonikerName[300];
       
        StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID));
        HRESULT hr = wsprintfW(wszMonikerName,  MONIKER_NAME, wszCLSID);
        if (FAILED(hr))
                return hr;
        memset(&bo, 0, sizeof(bo));
        bo.cbStruct = sizeof(bo);
        bo.hwnd = hwnd;
        bo.dwClassContext = CLSCTX_LOCAL_SERVER;
        if (IsRunningInWin64())
                bo.dwClassContext |= CLSCTX_ACTIVATE_32_BIT_SERVER;
        return CoGetObject(wszMonikerName, &bo, riid, ppv);

还是不能提权,CoGetObject 返回80080017
2014-11-17 18:11
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
0x80080017
CO_E_ELEVATION_DISABLED
The class is not configured to support elevated activation.
2014-11-19 01:42
0
游客
登录 | 注册 方可回帖
返回