#windows #winapi #visual-c #mfc
#Windows #winapi #visual-c #mfc
Вопрос:
2 трояна:
Вот код, который, как я считаю, вызывает проблему. Цель состоит в том, чтобы создать / изменить раздел реестра, чтобы программа запускалась при запуске:
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).
Это оставило у меня несколько вопросов:
- Моя программа имитирует поведение 2 троянов из-за какой-либо ошибки в кодировании?
- Или у меня на компьютере есть какая-то скрытая, оппортунистическая вредоносная программа, которая только и ждала, чтобы воспользоваться преимуществами?
- Необходимо ли удалять существующее значение перед попыткой его изменения? Поведение
RegCreateKeyEx
заставляет меня полагать, что это не так. - Является ли запись в реестр без повышенных разрешений запретной? Если да… почему моя машина позволяет мне это делать?
- Я выполняю какое-то неправильное преобразование типов в
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, а не с реальной ошибкой в вашем коде.