ZwCreateToken

Тема в разделе "WASM.WIN32", создана пользователем buggzy, 17 июл 2005.

  1. buggzy

    buggzy New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    3
    Создают токен сабжевым образом. Иногда наблюдаются непонятные тормоза функции LoadUserProfile, секунд на 30. Иногда она срабатывает, иногда - нет. Плюс непонятно, что будет, если таким вот юзером полезть в микрософтовскую сеть.



    Это все неизбежно ибо нефиг лезть в недокументированное? Или можно как-то избежать подобных проблем?
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Какая стоит собственно задача?
     
  3. buggzy

    buggzy New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    3
    Нужно некое подобие сервиса runas, но не требующее пароля. Сервис должен уметь загружать пользовательский профиль, хотя бы локальный.
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Пример запуска процесса под системным юзером:


    Код (Text):
    1. #include “ntdll.h”
    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. HANDLE SystemToken()
    11. {
    12. EnablePrivilege(SE_CREATE_TOKEN_NAME);
    13. HANDLE hToken;
    14. OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_QUERY_SOURCE,
    15. &hToken);
    16. SID_IDENTIFIER_AUTHORITY nt = SECURITY_NT_AUTHORITY;
    17. PSID system;
    18. AllocateAndInitializeSid(&nt, 1, SECURITY_LOCAL_SYSTEM_RID,
    19. 0, 0, 0, 0, 0, 0, 0, &system);
    20. TOKEN_USER user = {{system, 0}};
    21. LUID luid;
    22. AllocateLocallyUniqueId(&luid);
    23. TOKEN_SOURCE source = {{‘*’, ‘*’, ‘A’, ‘N’, ‘O’, ‘N’, ‘*’, ‘*’},
    24. {luid.LowPart, luid.HighPart}};
    25. LUID authid = SYSTEM_LUID;
    26. PTOKEN_STATISTICS stats
    27. = PTOKEN_STATISTICS(GetFromToken(hToken, TokenStatistics));
    28. NT::SECURITY_QUALITY_OF_SERVICE sqos
    29. = {sizeof sqos, NT::SecurityAnonymous,
    30. SECURITY_STATIC_TRACKING, FALSE};
    31. NT::OBJECT_ATTRIBUTES oa = {sizeof oa, 0, 0, 0, 0, &sqos};
    32. HANDLE hToken2 = 0;
    33. NT::ZwCreateToken(&hToken2, TOKEN_ALL_ACCESS, &oa, TokenPrimary,
    34. NT::PLUID(&authid), // NT::PLUID(&stats->AuthenticationId),
    35. NT::PLARGE_INTEGER(&stats->ExpirationTime),
    36. &user,
    37. PTOKEN_GROUPS(GetFromToken(hToken, TokenGroups)),
    38. PTOKEN_PRIVILEGES(GetFromToken(hToken, TokenPrivileges)),
    39. PTOKEN_OWNER(GetFromToken(hToken, TokenOwner)),
    40. PTOKEN_PRIMARY_GROUP(GetFromToken(hToken, TokenPrimaryGroup)),
    41. PTOKEN_DEFAULT_DACL(GetFromToken(hToken, TokenDefaultDacl)),&source);
    42. CloseHandle(hToken);
    43. return hToken2;
    44. }
    45. int main()
    46. {
    47. PROCESS_INFORMATION pi;
    48. STARTUPINFO si = {sizeof si};
    49. return CreateProcessAsUser(SystemToken(), 0, “cmd”, 0, 0, FALSE,
    50. CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
    51. 0, 0, &si, &pi);
    52. }




    Учти, что юзер от которого это будет работать должен иметь привилегию SE_CREATE_TOKEN
     
  5. buggzy

    buggzy New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    3
    :)



    Наверное, я непонятно выразился. Нужно делать то же самое, что делает сервис RunAs, то есть запускать заданное приложение под заданным пользователем, загружая его профиль. При этом не спрашивая пароль этого пользователя.
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вышеприведенный пример создает токен пользователя System, но что мешает тебе при создании токена передавать не SECURITY_LOCAL_SYSTEM_RID, а SID нужного пользователя?



    Только 100% загрузить профиль без пароля не удасться, так как в профиль входят ключи в защищенном хранилище, шифрованные NTFS файлы, и.т.д, а без пароля все это не может быть расшифровано.