Создание токена пользователя

Тема в разделе "WASM.WIN32", создана пользователем _Merovingian, 10 фев 2005.

  1. _Merovingian

    _Merovingian New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    6
    Доброго времени суток!



    Есть проблема с созданием токена пользователя при входе в систему. Используется функция ZwCreateToken
    Код (Text):
    1.  
    2. PVOID GetFromToken(HANDLE hToken, TOKEN_INFORMATION_CLASS tic)
    3. {
    4. DWORD n;
    5. BOOL rv = GetTokenInformation(hToken, tic, 0, 0, &n);
    6. if (rv == FALSE && GetLastError() != ERROR_INSUFFICIENT_BUFFER) return 0;
    7. PBYTE p = new BYTE[n];
    8. return GetTokenInformation(hToken, tic, p, n, &n) == FALSE ? 0 : p;
    9. }
    10.  
    11.  
    12. BOOL EnablePrivilege(PCSTR name)
    13. {
    14.   TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};
    15.   LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);
    16.  
    17.   HANDLE hToken;
    18.   OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
    19. &hToken);
    20.  
    21.   AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0);
    22.   DWORD dwLastError = GetLastError();
    23.   BOOL rv = dwLastError == ERROR_SUCCESS;
    24.  
    25.   CloseHandle(hToken);
    26.   return rv;
    27. }
    28.  
    29. //clear
    30.  
    31. HANDLE GetHtoken(wchar_t * usranama)
    32. {
    33.  
    34.     EnablePrivilege(SE_CREATE_TOKEN_NAME);
    35.  
    36.     DWORD size=256;
    37.        
    38.     HANDLE hToken;
    39.    
    40.     OpenProcessToken(GetCurrentProcess(),
    41.                         TOKEN_QUERY | TOKEN_QUERY_SOURCE,
    42.                         &hToken);
    43.    
    44.     SID_IDENTIFIER_AUTHORITY nt = SECURITY_NT_AUTHORITY;
    45.  
    46.     PSID system;
    47.    
    48.     system=lookupaccntname(usranama);
    49.     TOKEN_USER user = {{system, 0}};
    50.    
    51.        
    52.      LUID luid;
    53.     AllocateLocallyUniqueId(&luid);
    54.    
    55.    
    56.     TOKEN_SOURCE source =
    57.         {{'*', '*', 'A', 'N', 'O', 'N', '*', '*'},
    58.         {luid.LowPart, luid.HighPart}};
    59.  
    60.        
    61.     PTOKEN_STATISTICS stats = PTOKEN_STATISTICS(GetFromToken(hToken, TokenStatistics));
    62.  
    63.     LUID authid = SYSTEM_LUID;
    64.    
    65.     SECURITY_QUALITY_OF_SERVICE sqos = {sizeof sqos, SecurityAnonymous,
    66.                                         SECURITY_STATIC_TRACKING, FALSE};
    67.  
    68.     OBJECT_ATTRIBUTES oa = {sizeof oa, 0, 0, 0, 0, &sqos};
    69.     HANDLE hToken2 = 0;
    70.    
    71.    
    72.     NTSTATUS status=ZwCreateToken(&hToken2, TOKEN_ALL_ACCESS, &oa, TokenPrimary,
    73.                 PLUID(&authid),
    74.                 PLARGE_INTEGER(&stats->ExpirationTime),
    75.                 &user,
    76.                 PTOKEN_GROUPS(GetFromToken(hToken, TokenGroups)),
    77.                 PTOKEN_PRIVILEGES(GetFromToken(hToken, TokenPrivileges)),
    78.                 PTOKEN_OWNER(GetFromToken(hToken, TokenOwner)),
    79.                 PTOKEN_PRIMARY_GROUP(GetFromToken(hToken, TokenPrimaryGroup)),
    80.                 PTOKEN_DEFAULT_DACL(GetFromToken(hToken, TokenDefaultDacl)),
    81.                 &source);
    82.    
    83.       CloseHandle(hToken);                 
    84.          
    85.     return hToken2;
    86. }
    87.  




    Но так токен создается какой-то кривой, система часто падает. Подскажите, пожалуйста, что пофиксить?
     
  2. Snizhok

    Snizhok New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    3
    Адрес:
    Германия
    В исходниках Неббета (Native API Reference) пример этого.



    И да, это точно работать будет.





    [​IMG] 1171835132__Example8.1.txt
     
  3. _Merovingian

    _Merovingian New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    6
    Спасибо за пример!

    Но этот пример, очевидно, создает пользователя Local System. А хотелось бы создавать пользовательский токен идентичный оригинальному. Кто знает как, пожалуйста, поделитесь опытом.

    Thanks in advance, Merovingian.