Защитник Windows идентифицирует мою программу как несколько троянов («Wacatac» и «Persistence») — предположительно, вызвано перезаписью раздела реестра

#windows #winapi #visual-c #mfc

#Windows #winapi #visual-c #mfc

Вопрос:

2 трояна:

Wacatac.G!ml

wacatac

Persistence.G!ml

постоянство

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

 void SoftwareDlg::SetSURegValue() {
    string regSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run\");
    string regValueName = "Software";
    string regValue = "D:\Users\Skew\Documents\repos\Software\Debug\Software.exe"

    try
    {
        size_t bufferSize = 0xFFF;
        auto cbData = static_cast<DWORD>(regValue.size() * sizeof(char));
        HKEY hKey;
        DWORD position;
        
        auto rc = RegCreateKeyEx(HKEY_CURRENT_USER, regSubKey.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, amp;hKey, amp;position);
        if (position == REG_OPENED_EXISTING_KEY) {
            DEBUG_PRINT("Key already exists amp; has been opened.")
        }
        else if (position == REG_CREATED_NEW_KEY) {
            DEBUG_PRINT("Created new key.")
        }
        else {
            DEBUG_PRINT("ERROR: Key does not exist, and a new key was not created.")
        }

        if (rc == ERROR_SUCCESS) {
            auto rc = RegSetValueEx(hKey, regValueName.c_str(), 0, REG_SZ, (BYTE*)regValue.data(), cbData);
            if (rc != ERROR_SUCCESS)
            {
                throw std::runtime_error("Windows system error code: "   to_string(rc));
            }
        }
        else {
            DEBUG_PRINT("Error opening key.n")
        }
    }
    catch (std::exceptionamp; e)
    {
        DEBUG_PRINT(e.what())
    }
}
 

В моих попытках решить эту проблему я начал тестировать различные сценарии создания / изменения ключа, но мои результаты стали неубедительными, когда я понял, что защитник Windows, похоже, перестал регистрировать каждый запуск как «новые угрозы» и, похоже, регистрировал их вместе как единую «проникающую угрозу», я полагаю? Не совсем уверен.

С учетом сказанного защитник Windows, похоже, не регистрировал угрозу, когда я изначально создавал ключ или когда я открывал его и присваивал ему то же значение, но, похоже, регистрировал угрозу, когда я перемещал программу в новый каталог (и программа пыталась изменить значениезначения реестра «Программное обеспечение» в новое местоположение EXE).

Это оставило у меня несколько вопросов:

  1. Моя программа имитирует поведение 2 троянов из-за какой-либо ошибки в кодировании?
  2. Или у меня на компьютере есть какая-то скрытая, оппортунистическая вредоносная программа, которая только и ждала, чтобы воспользоваться преимуществами?
  3. Необходимо ли удалять существующее значение перед попыткой его изменения? Поведение RegCreateKeyEx заставляет меня полагать, что это не так.
  4. Является ли запись в реестр без повышенных разрешений запретной? Если да… почему моя машина позволяет мне это делать?
  5. Я выполняю какое-то неправильное преобразование типов в RegSetValueEx() функции?

Если дело в # 4, я думаю, я просто очень удивлен, что меня уведомил защитник Windows, а не Visual Studio или приглашение UAC.

Редактировать 1: движки не включены VirusTotal.com обнаружен файл как вредоносный.

Комментарии:

1. Я добавил эту функцию в свой проект, и защитник Windows проверил ее как отсутствие угрозы. Вы уверены, что это все? Вы прокомментировали содержимое функции, и проблема исчезла?

2. Да, когда я удаляю функцию, проблема, похоже, исчезает. Можете ли вы попробовать запустить ту же программу из другого местоположения?

3. 3 и 4 , конечно, нет. для чего вы используете string здесь? почему A вместо W ? и почему вы не спрашиваете — почему ошибка защитника Windows , вместо этого найдите ошибку в вашем коде

4. в конкретном случае виноват исключительно защитник Windows. я, конечно, использую W , здесь вообще не использую string (для чего), а простые L «…» строки. но все это не связано с ложным обнаружением защитника Windows

5. @Skewjo каждая передаваемая строка OutputDebugString() обрабатывается отладчиками как отдельная строка для отображения, поэтому нет необходимости выводить разрыв строки самостоятельно. Но, если вам действительно нужно, было бы разумнее использовать OutputDebugString((OutputString "n").c_str()) вместо этого. В любом случае, ваша проблема, скорее всего, связана с ложным срабатыванием в самом WD, как сказал RbRm, а не с реальной ошибкой в вашем коде.