C# вирусная часть кода

Всем привет. Пишу приложение которое должно запускать процесс и инжектить в неё dll библиотеку. В целом я это сделал, но дело в virustotal, он показывает что в приложении есть вирусы.

Как можно сделать инжект библиотеки в процесс скрытно от антивирусов?

Код инжектора:

    // inject method
    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetModuleHandle(string lpModuleName);

    [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
    static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool WriteProcessMemory(IntPtr hProcess,
        IntPtr lpBaseAddress,
        byte[] lpBuffer,
        uint nSize,
        out UIntPtr lpNumberOfBytesWritten);

    [DllImport("kernel32.dll")]
    static extern IntPtr CreateRemoteThread(IntPtr hProcess,
        IntPtr lpThreadAttributes,
        uint dwStackSize,
        IntPtr lpStartAddress,
        IntPtr lpParameter,
        uint dwCreationFlags,
        IntPtr lpThreadId);

    // privileges
    const int PROCESS_CREATE_THREAD = 0x0002;
    const int PROCESS_QUERY_INFORMATION = 0x0400;
    const int PROCESS_VM_OPERATION = 0x0008;
    const int PROCESS_VM_WRITE = 0x0020;
    const int PROCESS_VM_READ = 0x0010;

    // used for memory allocation
    const uint MEM_COMMIT = 0x00001000;

    const uint MEM_RESERVE = 0x00002000;
    const uint PAGE_READWRITE = 4;

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWow64Process(
        [In] IntPtr hProcess,
        [Out] out bool wow64Process
    );

    public static int DoInject(string dllPath, Process tProcess)
    {
        Process targetProcess = tProcess;
        string dllName = dllPath;
        IntPtr procHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, targetProcess.Id);
        IntPtr loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
        IntPtr allocMemAddress = VirtualAllocEx(procHandle, IntPtr.Zero, (uint)((dllName.Length + 1) * Marshal.SizeOf(typeof(char))), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
        UIntPtr bytesWritten;
        WriteProcessMemory(procHandle, allocMemAddress, Encoding.Default.GetBytes(dllName), (uint)((dllName.Length + 1) * Marshal.SizeOf(typeof(char))), out bytesWritten);
        CreateRemoteThread(procHandle, IntPtr.Zero, 0, loadLibraryAddr, allocMemAddress, 0, IntPtr.Zero);
        return 0;
    }

Ответы (1 шт):

Автор решения: aepot

Вы не правильно поставили вопрос: надо не "как спрятаться от антивируса?", это может говорить о том, что вы пишете сомнительный код, а надо спрашивать "как понять, на что именно ругается антивирус?". Вы ведь не пишете ничего опасного, правда? Если это не так, можете удалить свой вопрос, на StackOverflow подобный код не приветствуется.

У меня самого каталог с C# репозиториями находится в исключениях антивируса.

Правило

Если ваш код детектится антивирусной программой как зараза, это значит, что существует зараза, в которой имеется кодовая сигнатура, найденная у вас.

Варианты действий

Как ни странно, прятать подобное от антивируса - смысла мало, он все равно найдет, пройдется эвристикой, расшифрует, и т.д. В последний раз я получил срабатывание Symantec антивируса на приложение, которое просто использует WebBrowser, чтобы выполнить некий сценарий в админке моего сайта. У меня вообще ни одного P/Invoke вызова в приложении не было.

А избавился я от сработки просто сделав код более лаконичным и менее запутанным. Как только я прорефакторился и избавился от костылей, антивирус перестал ругаться. Получается, что если не прячешься, а наоборот пишешь открыто и линейно с минимумом запутанности, антивирус реагирует на не опасный код с меньшей вероятностью.

В вашем же случае реально используются опасные операции, которые используются зловредами. Попробуйте обезвредить свой код, например, сделайте его неполноценным, чтобы ругаться перестало, затем смотрите, что убрали. Затем как найдете, что именно делает ваш код "вредоносным", уже ищите, как это исправить.

False Positive у антивирусов - обычное дело. Но здесь не надо ничего прятать, если конечно вы не пишете вредоносный код, здесь наоборот надо быть максимально простым и открытым. В линейном коде антивирусу проще разобраться, и понять, что ваш код не представляет опасности.

→ Ссылка