Передача прав.

Тема в разделе "WASM.WIN32", создана пользователем Zero Ice, 3 дек 2005.

  1. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Жалко что только на поток действует. 8) Придется все потоки пройти :)
     
  2. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    2DelExe

    Если можешь показать другой пример, буду оооочень признателен...
     
  3. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Трудно понять, какие у тебя проблеммы с декстопами. Ведь на практике всё это чудо делаеться за один заход сервисом. Потому во избежании недопонимания предлагаю „упрощенную” схему создания системного процесса.



    Маленькая экскурсия в теорию:

    1) AdjustTokenPrivileges – способна лишь изменить состояние привилегии Disable\Enable. При создании токена, система сама указывает привилегии. Их можно лишь активизировать, или наоборот скинуть.

    Посмотреть какие привилегии доступны процессу можно с помощью «Process Explorer» Марка Руссиновича (Properties->Security). Скажем так – для пользователя там привилегий не густо.

    2) Если необходимо добавить отсутствующие привилегии и, естественно, активизировать их - используют ZwCreateToken. После чего вызовом CreateProcessAsUser создают процесс с новым набором привилегий.

    3) Есть функция ZwSetInformationToken - „устанавливает информацию, влияющую на объект маркера”. Да вот беда, из 12 информационных классов, установке подлежат лишь 4 – TokenOwner, TokenPrimaryGroup, TokenDefaultDacl, TokenSessionId. Класс TokenPrivileges установке не подлежит (можно только читать). На эту функцию люди или забивают или правят сам объект токена (с режима драйвера). Это не есть гуд, так как объект не документирован, изменения происходят без ведома системы и т.д. и т.п. У меня после таких фокусов система не падала „почти” пару минут. :derisive:



    Итак. Схема такова.

    1. сервис. Пусть будет Father.

    2. пользовательский процесс. Пусть будет Mother.

    3.пользовательская программа, которой необходимы привилегии.



    1) Mother сообщает Father свой PID.

    Используешь средства межпроцессного взаимодействия: пайпы, окошка, атомы, проецированные файлы …



    2) Father берёт свой токен, и дублирует его для Mother.
    Код (Text):
    1.  
    2. //Получить токен текущего процесса Father.
    3. HANDLE hFatherToken;
    4. OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hFatherToken);
    5.  
    6. //Получить описатель процесса Mather используя PID.
    7. DWORD MatherPID = 0x??????;
    8. HANDLE hProcMather = OpenProcess(PROCESS_ALL_ACCESS, false, MatherPID);
    9.  
    10. //Дублировать токен.
    11. HANDLE hDuplicateFatherToken;//После дублирования нужно передать эту "штуку" в Mather.
    12. DuplicateHandle( GetCurrentProcess(),
    13.                 hFatherToken,
    14.                 hProcMather,
    15.                 &hDuplicateFatherToken,
    16.                 0,
    17.                 FALSE,
    18.                 DUPLICATE_SAME_ACCESS );
    19.  


    3) Father ставит в известность Mother, что мол получай мой токен.

    Средства межпроцессного взаимодействия.



    4) Mother спрашивает у юзера, какой процесс должен стать системным.



    5) Mother с помощью CreateProcessAsUser(hDuplicateFatherToken, …) создаёт системный процесс для юзера.
    Код (Text):
    1.  
    2.     STARTUPINFO si;
    3.     ZeroMemory( &si, sizeof(si) );
    4.     si.cb = sizeof(si);
    5.     PROCESS_INFORMATION pi;
    6. //В примере запускаем командный интерпретатор.
    7.     CreateProcessAsUser( hDuplicateFatherToken , 0, "cmd.exe", 0, 0,
    8.                     false, CREATE_NEW_CONSOLE, 0, 0, &si ,&pi );
    9.  


    P.S. Если ты начнёшь всё это реализовывать, то очень скоро пропадёт желание так играться ради призрачной проблемы десктопов. И возможно тогда ты вернешься к простому варианту, когда сервис вызывает CreateProcessAsUser, задав перед этим si.lpDesktop = "WinSta0\\Default";



    Вот и сказке конец, а кто читал – молодец.
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Zero Ice







    ты сам то понял что спросил ? ;), запусти тачку и посмотри.
     
  5. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    IMHO не стоит так делать (повышать привилегии юзерского процесса). Так можно создать нехилую дыру в безопасности.

    Если это всё не для внутреннего пользования конечно...



    Лучше, как уже советовали, сделать юзерский процесс клиентом сервиса, который будет делать всю привилегированную работу.

    Средствами RPC или COM межпроцессное взаимодействие делается довольно прозрачным.
     
  6. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Zero Ice

    Насчёт десктопов - утилитка перечисляет окна, Station, Desktop:

    hххp://www.anticracking.sk/EliCZ/export/EnumWD.zip
     
  7. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    2DelExe

    OpenProcessToken( GetCurrentProcess(), TOKEN_ALL_ACCESS, &hFatherToken);

    Этот токен позволяет запустит приложение, но есть непонятный глюк - если прога запушена под админом, то полчив токен делаю CreateProcessAsUser и получаю cmd.exe с правами SYSTEM, если же запускаю прогу под гостем - токен есть, но CreateProcessAsUser проваливается. GetLastError == 2 (Не удается найти указанный файл).

    Прописывал полный путь к exe - не помогло.
     
  8. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Прототип функции:

    BOOL CreateProcessAsUser(

    HANDLE hToken,

    LPCTSTR lpApplicationName,

    LPTSTR lpCommandLine,

    ....)



    Попробуй передавать "cmd.exe" не в параметре lpCommandLine, а в lpApplicationName (тогда вместо lpCommandLine поставь 0).
     
  9. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Пробовал. Тут что-то не то. :dntknw:

    Уже сам замучился с этой проблемой и всех достал, но салюшина так пока и не нашел.

    Проблема в том, что когда даешь токен непривелигированному процу, то у него видать не хватает привелегий для использования этого токена. Значит всё надо установить в сервисе. А ХЗ как это делать... Буду рыть дальше. Если найду ришение - выложу тут.
     
  10. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    MSDN: "Typically, the process that calls the CreateProcessAsUser function must have the SE_ASSIGNPRIMARYTOKEN_NAME and SE_INCREASE_QUOTA_NAME privileges."

    Сервис создаётся с флагом SERVICE_INTERACTIVE_PROCESS ?

    При этом твой "приподнятый" процесс не могёт десктоп юзать ?
     
  11. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Знаю про эту привилегию. И флаг SERVICE_INTERACTIVE_PROCESS. Но мне больше интересно как права дать. Как его приподнять? (убийство и запуск с правами system не особо радует)