Пытаюсь загрузить дров и получаю след. error 0xC0000061 (STATUS_PRIVILEGE_NOT_HELD) вот код: Код (Text): BOOL NtSetPrivilege(IN ULONG Privilege) { BOOL bRet = FALSE; LUID Luid; Luid.LowPart = Privilege; Luid.HighPart = 0; TOKEN_PRIVILEGES TokenPrivileges; TokenPrivileges.PrivilegeCount = 1; TokenPrivileges.Privileges[0].Luid = Luid; TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; HANDLE TokenHandle; NTSTATUS NtStatus = NtOpenProcessToken(NtCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&TokenHandle); if(NT_SUCCESS(NtStatus)) { NtStatus = NtAdjustPrivilegesToken(TokenHandle,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL,0); if(NT_SUCCESS(NtStatus)) { bRet = TRUE; } } NtClose(TokenHandle); return bRet; } typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE // Information Class 38 { UNICODE_STRING ModuleName; } SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE; BOOL LoadImage(void) { BOOL bRet = FALSE; WCHAR szImgPath[] = L"\\??\\D:\\direct.sys"; //LoadImage---------------------------------------------------------------------------- SYSTEM_LOAD_AND_CALL_IMAGE payLoad; RtlInitUnicodeString(&(payLoad.ModuleName),szImgPath); if (NtSetPrivilege(SE_LOAD_DRIVER_PRIVILEGE)) { // SystemAddDriver = 38! NTSTATUS Status = NtSetSystemInformation(SystemAddDriver,(PVOID)&payLoad,sizeof(payLoad)); if (NT_SUCCESS(Status)) { bRet = TRUE; } } return bRet; } В чем проблема ?
Хотя суть не в том. И я не уверен что это работает на всех осях. Ошибку в привелегиях возвращает NtSetSystemInformation значит косяк в назначении привелегий....
Код (Text): #include <windows.h> #include <stdio.h> typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; #ifdef MIDL_PASS [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer; #else // MIDL_PASS PWSTR Buffer; #endif // MIDL_PASS } UNICODE_STRING, *PUNICODE_STRING; typedef unsigned long NTSTATUS; #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) NTSTATUS (__stdcall *ZwSetSystemInformation)( IN DWORD SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength ); VOID (__stdcall *RtlInitUnicodeString)( IN OUT PUNICODE_STRING DestinationString, IN PCWSTR SourceString ); typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE { UNICODE_STRING ModuleName; } SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE; #define SystemLoadAndCallImage 38 void main(void) { /////////////////////////////////////////////////////////////// // Why mess with Drivers? /////////////////////////////////////////////////////////////// SYSTEM_LOAD_AND_CALL_IMAGE GregsImage; WCHAR daPath[] = L"\\??\\C:\\_root_.sys"; ////////////////////////////////////////////////////////////// // get DLL entry points ////////////////////////////////////////////////////////////// if( !(RtlInitUnicodeString = (void *) GetProcAddress( GetModuleHandle("ntdll.dll"), "RtlInitUnicodeString" )) ) exit(1); if( !(ZwSetSystemInformation = (void *) GetProcAddress( GetModuleHandle("ntdll.dll"), "ZwSetSystemInformation" )) ) exit(1); RtlInitUnicodeString( &(GregsImage.ModuleName), daPath ); NT_SUCCESS( ZwSetSystemInformation( SystemLoadAndCallImage, &GregsImage, sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)) )) { printf("Loaded.\n"); } else { printf("not loaded.\n"); } }
Тема обсуждалась неоднократно, пользуйтесь поиском! Начиная с win2k3, может и раньше, вставили дополнительную проверку: Код (Text): ... if (PreviousMode != KernelMode) { if (MmIsSessionLeaderProcess(PsGetCurrentProcess()) == FALSE) { return STATUS_PRIVILEGE_NOT_HELD; } ... } ... Код (Text): #define MmIsSessionLeaderProcess(Process) \ ((Process)->Vm.Flags.SessionLeader == 1) То есть примеру на той же win2k3, вызывать загрузку драйвера подсистемы может только smss.exe.