delexclusion.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <wbemidl.h>
  4. #include "delexclusion.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 RemoveDefenderExclusion(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"Remove");
  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. if (hr == 0x8004102e) {
  82. BeaconPrintf(CALLBACK_ERROR, "Failed to remove the exclusion (WBEM_E_NOT_FOUND). The specified data/name was not recognized or doens't exist.\n");
  83. } else if (hr == 0x80041001) {
  84. BeaconPrintf(CALLBACK_ERROR, "Failed to remove the exclusion (WBEM_E_FAILED). Do you have sufficient permissions?\n");
  85. } else {
  86. BeaconPrintf(CALLBACK_ERROR, "Failed to remove the exclusion with error code: 0x%08lx\n", hr);
  87. }
  88. result = 2;
  89. goto Cleanup;
  90. }
  91. result = 1;
  92. Cleanup:
  93. if (psaStrings) OLEAUT32$SafeArrayDestroy(psaStrings);
  94. if (Clname) OLEAUT32$SysFreeString(Clname);
  95. if (pLoc) pLoc->lpVtbl->Release(pLoc);
  96. if (pSvc) pSvc->lpVtbl->Release(pSvc);
  97. if (pClass) pClass->lpVtbl->Release(pClass);
  98. if (pInSignature) pInSignature->lpVtbl->Release(pInSignature);
  99. if (pClassInstance) pClassInstance->lpVtbl->Release(pClassInstance);
  100. OLE32$CoUninitialize();
  101. return result;
  102. }
  103. int go(char *args, int len) {
  104. int result = 0;
  105. CHAR* exclType = ""; //path | process | extension
  106. WCHAR* exclData = L"";
  107. datap parser;
  108. BeaconDataParse(&parser, args, len);
  109. exclType = BeaconDataExtract(&parser, NULL);
  110. exclData = BeaconDataExtract(&parser, NULL);
  111. if(MSVCRT$strcmp(exclType, "path") == 0) result = RemoveDefenderExclusion(exclData, EXCLUSION_TYPE_PATH);
  112. else if(MSVCRT$strcmp(exclType, "process") == 0) result = RemoveDefenderExclusion(exclData, EXCLUSION_TYPE_PROCESS);
  113. else if(MSVCRT$strcmp(exclType, "extension") == 0) result = RemoveDefenderExclusion(exclData, EXCLUSION_TYPE_EXTENSION);
  114. else {
  115. BeaconPrintf(CALLBACK_ERROR, "Please specify one of the following exclusion types: path (folder/file), process, extension.\n");
  116. return 0;
  117. }
  118. if(result == 1) BeaconPrintf(CALLBACK_OUTPUT, "[+] The following exclusion was successfully removed: %ls\n", exclData);
  119. else if (result == 2); //output handeling specified in RemoveDefenderExclusion
  120. else BeaconPrintf(CALLBACK_ERROR, "Failed to remove exclusion. COM error occurred!\n");
  121. return 0;
  122. }