NtSetSystemInformation

Тема в разделе "WASM.WIN32", создана пользователем 984259h, 21 июн 2010.

  1. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Пытаюсь загрузить дров и получаю след. error 0xC0000061 (STATUS_PRIVILEGE_NOT_HELD)
    вот код:
    Код (Text):
    1. BOOL NtSetPrivilege(IN ULONG Privilege)
    2. {
    3.     BOOL bRet = FALSE;
    4.     LUID Luid;
    5.     Luid.LowPart = Privilege;
    6.     Luid.HighPart = 0;
    7.  
    8.     TOKEN_PRIVILEGES TokenPrivileges;
    9.     TokenPrivileges.PrivilegeCount = 1;
    10.     TokenPrivileges.Privileges[0].Luid = Luid;
    11.     TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    12.  
    13.     HANDLE TokenHandle;
    14.     NTSTATUS NtStatus = NtOpenProcessToken(NtCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&TokenHandle);
    15.     if(NT_SUCCESS(NtStatus))
    16.     {
    17.        NtStatus = NtAdjustPrivilegesToken(TokenHandle,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),                  (PTOKEN_PRIVILEGES)NULL,0);                    
    18.        if(NT_SUCCESS(NtStatus))
    19.        {
    20.          bRet = TRUE;
    21.        }
    22.     }
    23.     NtClose(TokenHandle);
    24.  return bRet;
    25. }
    26.  
    27. typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE  // Information Class 38
    28. {
    29.   UNICODE_STRING ModuleName;
    30. }
    31. SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;
    32.  
    33. BOOL LoadImage(void)
    34. {
    35.   BOOL bRet = FALSE;
    36.   WCHAR szImgPath[] = L"\\??\\D:\\direct.sys";
    37.   //LoadImage----------------------------------------------------------------------------
    38.   SYSTEM_LOAD_AND_CALL_IMAGE payLoad;
    39.   RtlInitUnicodeString(&(payLoad.ModuleName),szImgPath);
    40.   if (NtSetPrivilege(SE_LOAD_DRIVER_PRIVILEGE))
    41.   {
    42.     // SystemAddDriver = 38!
    43.     NTSTATUS  Status = NtSetSystemInformation(SystemAddDriver,(PVOID)&payLoad,sizeof(payLoad));
    44.     if (NT_SUCCESS(Status))
    45.     {
    46.         bRet = TRUE;
    47.     }
    48.   }
    49.  return bRet;
    50. }
    В чем проблема ?
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Смотря что за ось....
     
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Хотя суть не в том. И я не уверен что это работает на всех осях. Ошибку в привелегиях возвращает NtSetSystemInformation значит косяк в назначении привелегий....
     
  4. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    punxer
    Win 7(x86)
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. typedef struct _UNICODE_STRING {
    5.     USHORT Length;
    6.     USHORT MaximumLength;
    7. #ifdef MIDL_PASS
    8.     [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
    9. #else // MIDL_PASS
    10.     PWSTR  Buffer;
    11. #endif // MIDL_PASS
    12. } UNICODE_STRING, *PUNICODE_STRING;
    13.  
    14. typedef unsigned long NTSTATUS;
    15. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
    16.  
    17. NTSTATUS (__stdcall *ZwSetSystemInformation)(
    18.   IN DWORD SystemInformationClass,
    19.   IN OUT PVOID SystemInformation,
    20.   IN ULONG SystemInformationLength
    21.   );
    22.  
    23. VOID (__stdcall *RtlInitUnicodeString)(
    24.   IN OUT PUNICODE_STRING  DestinationString,
    25.   IN PCWSTR  SourceString
    26.   );
    27.  
    28. typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE
    29. {
    30.  UNICODE_STRING ModuleName;
    31. } SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;
    32.  
    33. #define SystemLoadAndCallImage 38
    34.  
    35. void main(void)
    36. {
    37.  ///////////////////////////////////////////////////////////////
    38.  // Why mess with Drivers?
    39.  ///////////////////////////////////////////////////////////////
    40.  SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;
    41.  WCHAR daPath[] = L"\\??\\C:\\_root_.sys";
    42.  
    43.  //////////////////////////////////////////////////////////////
    44.  // get DLL entry points
    45.  //////////////////////////////////////////////////////////////
    46.  if( !(RtlInitUnicodeString =
    47.   (void *) GetProcAddress( GetModuleHandle("ntdll.dll"),
    48.   "RtlInitUnicodeString" )) )
    49.   exit(1);
    50.  
    51.  if( !(ZwSetSystemInformation =
    52.   (void *) GetProcAddress( GetModuleHandle("ntdll.dll"),
    53.   "ZwSetSystemInformation" )) )
    54.   exit(1);
    55.  
    56.  RtlInitUnicodeString(  &(GregsImage.ModuleName),
    57.     daPath );
    58.  
    59.  
    60. NT_SUCCESS(
    61.   ZwSetSystemInformation(  SystemLoadAndCallImage,
    62.       &GregsImage,
    63.       sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)) ))
    64.  {
    65.   printf("Loaded.\n");
    66.  }
    67.  else
    68.  {
    69.   printf("not loaded.\n");
    70.  }
    71. }
     
  6. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    punxer
    Это тотже код ...
     
  7. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Тема обсуждалась неоднократно, пользуйтесь поиском!
    Начиная с win2k3, может и раньше, вставили дополнительную проверку:
    Код (Text):
    1. ...
    2.                 if (PreviousMode != KernelMode) {
    3.                     if (MmIsSessionLeaderProcess(PsGetCurrentProcess()) == FALSE) {
    4.                         return STATUS_PRIVILEGE_NOT_HELD;
    5.                     }
    6. ...
    7.                }
    8. ...
    Код (Text):
    1. #define MmIsSessionLeaderProcess(Process)   \
    2.             ((Process)->Vm.Flags.SessionLeader == 1)
    То есть примеру на той же win2k3, вызывать загрузку драйвера подсистемы может только smss.exe.
     
  8. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    0x6b65
    ясно, спасибо за ответ