Cogitations poenam nemo patitur (лат.)Как продолжение 1 части
Никто не несет наказания за мысли
© sysenter 2004
JID: sysenter@jabber.no
Динамический запуск и выгрузка драйвера, используя, естественно, только нативные технологии
Для начала получаем привилегии работы с дровами:
Загрузка:Код (C++):
BOOL EnableLoadDriverPrivilege(BOOL fEnable) { BOOL fOk = FALSE; HANDLE hToken; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); fOk = (GetLastError() == ERROR_SUCCESS); CloseHandle(hToken); } return(fOk); }Динамическая выгрузка производится через NtUnloadDriver, смотря какое имя вы задали сервису, см выше. Там я поставил "drivername". Тут все вообще просто. Зная имя сервиса, можете попробовать выгрузить динамически любой другой драйвер. НО ― смотря как у драйвера устроен механизм выхода. Возможно приведет к BSOD, если в нем не завершились операции ввода-вывода или сделан через одно местоКод (C++):
DWORD WINAPI LoadDriverX(LPVOID lpvParam) { WCHAR* strI=(WCHAR*)lpvParam; WCHAR regD[]=L"\\registry\\machine\\SYSTEM\\CurrentControlSet\\Services\\drivername"; UNICODE_STRING us; WCHAR* drivn=wcsrchr(wcDriver,'\\')+1; WCHAR* dot=wcsrchr(strI,'.'); WCHAR serv[MAX_PATH]; wcscpy(serv,drivn); serv[dot-drivn]=0; WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,regD); RtlInitUnicodeString(&us,regp); OBJECT_ATTRIBUTES OA; UNICODE_STRING ValueName,nPath; ULONG Disposition; HANDLE KeyHandle; RtlInitUnicodeString(&ValueName,regp); InitializeObjectAttributes(&OA, &ValueName,OBJ_CASE_INSENSITIVE,NULL,NULL); if(NT_SUCCESS(NtCreateKey(&KeyHandle,KEY_ALL_ACCESS,&OA,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition ))) { RtlInitUnicodeString(&ValueName,L"ImagePath"); RtlDosPathNameToNtPathName_U(strI,&nPath,NULL,NULL); if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_EXPAND_SZ,nPath.Buffer,nPath.Length+sizeof(WCHAR)))) { RtlInitUnicodeString(&ValueName,L"Type"); DWORD type=1; if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD)))) { NTSTATUS st; st=NtLoadDriver(&us); if(NT_SUCCESS(st)) { return (DWORD)KeyHandle; } NtClose(KeyHandle); return NULL; } } NtClose(KeyHandle); } return NULL; }Код (C++):
UNICODE_STRING us; RtlInitUnicodeString(&us,wcServiceName); NtUnloadDriver(&us);
Для любителей натива (часть 2) Игры с драйверами
Дата публикации 9 янв 2018
| Редактировалось 24 янв 2018