• mmc20创建进程c/c++实现


    背景

    最近写了一份遍历clsid所有接口的代码(链接点这里),在查找有意思的包含exe方法的时候发现了mmc20,且接口是6efc2da2-b38c-457e-9abb-ed2d189b8c38。

    但常见的使用mmc20都是用的vbs和powershell来创建的进程,这里提供c/c++的实现。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #pragma comment(lib, "Rpcrt4.lib")
    6. using namespace std;
    7. void MMC20ExeDemo2()
    8. {
    9. CLSID clsidshell;
    10. LPDISPATCH lpDisp;
    11. HRESULT hres = E_FAIL;
    12. hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    13. hres = CLSIDFromString(L"{49b2791a-b1ae-4c90-9b8e-e860ba07f889}", &clsidshell);
    14. if (FAILED(hres))
    15. {
    16. printf("CLSIDFromProgID or CLSIDFromString failed %x \n", hres);
    17. CoUninitialize();
    18. return ;
    19. }
    20. hres = CoCreateInstance(clsidshell, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID*)& lpDisp);
    21. if (FAILED(hres))
    22. {
    23. printf("CoCreateInstance failed %x \n", hres);
    24. CoUninitialize();
    25. return ;
    26. }
    27. LPOLESTR pFuncName = (LPOLESTR)L"Document";
    28. DISPID Run;
    29. hres = lpDisp->GetIDsOfNames(IID_NULL, &pFuncName, 1, LOCALE_SYSTEM_DEFAULT, &Run);
    30. if (FAILED(hres))
    31. {
    32. printf("GetIDsOfNames failed %x \n", hres);
    33. lpDisp->Release();
    34. CoUninitialize();
    35. return;
    36. }
    37. DISPPARAMS disParams = { NULL, NULL, 0, 0 };
    38. VARIANT pVarResult;
    39. hres = lpDisp->Invoke(Run, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &disParams, &pVarResult, NULL, NULL);
    40. if (FAILED(hres))
    41. printf("Invoke failed %x \n", hres);
    42. if (pVarResult.vt == VT_DISPATCH)
    43. {
    44. LPDISPATCH lpDisp2 = pVarResult.pdispVal;
    45. LPOLESTR pFuncName = (LPOLESTR)L"ActiveView";
    46. DISPID Run;
    47. hres = lpDisp2->GetIDsOfNames(IID_NULL, &pFuncName, 1, LOCALE_SYSTEM_DEFAULT, &Run);
    48. if (FAILED(hres))
    49. {
    50. printf("lpDisp2->GetIDsOfNames failed %x \n", hres);
    51. }
    52. DISPPARAMS disParams2 = { NULL, NULL, 0, 0 };
    53. VARIANT pVarResult2;
    54. hres = lpDisp2->Invoke(Run, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &disParams2, &pVarResult2, NULL, NULL);
    55. if (FAILED(hres))
    56. printf("lpDisp2->Invoke failed %x \n", hres);
    57. if (pVarResult2.vt == VT_DISPATCH)
    58. {
    59. LPDISPATCH lpDisp3 = pVarResult2.pdispVal;
    60. LPOLESTR pFuncName = (LPOLESTR)L"Executeshellcommand";
    61. DISPID Run;
    62. hres = lpDisp3->GetIDsOfNames(IID_NULL, &pFuncName, 1, LOCALE_SYSTEM_DEFAULT, &Run);
    63. if (FAILED(hres))
    64. {
    65. printf("lpDisp3->GetIDsOfNames failed %x \n", hres);
    66. }
    67. VARIANTARG V[4];
    68. V[0].vt = VT_BSTR;
    69. V[0].bstrVal = _bstr_t(L"");
    70. V[1].vt = VT_BSTR;
    71. V[1].bstrVal = _bstr_t(L"");
    72. V[2].vt = VT_BSTR;
    73. V[2].bstrVal = _bstr_t(L"");
    74. V[3].vt = VT_BSTR;
    75. V[3].bstrVal = _bstr_t(L"calc.exe");
    76. DISPPARAMS disParams3 = { V, NULL, 4, 0 };
    77. VARIANT pVarResult3;
    78. hres = lpDisp3->Invoke(Run, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &disParams3, &pVarResult3, NULL, NULL);
    79. if (FAILED(hres))
    80. printf("lpDisp3->Invoke failed %x \n", hres);
    81. }
    82. }
    83. lpDisp->Release();
    84. CoUninitialize();
    85. return ;
    86. }
    87. int main()
    88. {
    89. MMC20ExeDemo2();
    90. system("pause");
    91. return TRUE;
    92. }
  • 相关阅读:
    力扣labuladong——一刷day05
    tcp/ip:记一次完整的数据包传输过程
    云原生丨5大Datadog集成,快速提高团队效率!
    哪些人群在报考浙大工程管理硕士(MEM)?
    浅谈React中的ref和useRef
    课堂练习12 继承与多态
    trace clock structure的若干方法
    快手API接口解析,实现根据ID取商品详情
    启动uniapp小程序报错:Error:app.json:在项目根目录中未找到app.json
    nextTick源码解读
  • 原文地址:https://blog.csdn.net/qq_37353105/article/details/133035372