Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процессы, Процессы 
:(
    Опции темы
ng_softman
Дата 9.5.2003, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.5.2003

Репутация: нет
Всего: нет



Как, зная имя и пароль другого пользователя, запустить процесс, чтобы тот имел все

привелегии данного пользователя, или хотябы как получить токен контекста безопасности

и/или ACE (Access Control Entry).

функции
- LoginUser & CreateProcesssAsUser
- CreateProcessWithLogonW
выдают ошибку: "A required privilege is not held by the client."
PM MAIL   Вверх
man2002ua
Дата 10.5.2003, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



для выполнения этих ф-й надо иметь привилегию SE_TCB_NAME. Проверь установлена ли она для пользователя, к-й вызывает LogonUser и если нет - установи.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
ng_softman
Дата 10.5.2003, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.5.2003

Репутация: нет
Всего: нет



Вот код, который сначала устанавливает SE_TCB_NAME, потом пытается выполнить LogonUser результат один и тот же.

А вот CreateProcessWithLogonW работает на ура, но только под w2k и выше.

#ifndef UNICODE
#define UNICODE
#endif

#include "windows.h"
#include "stdio.h"
#include "ntsecapi.h"

int SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege);

int DisplayError(WCHAR* szAPI);

/*
argv[1] - domain
argv[2] - user name
argv[3] - password
argv[4] - path to executable file
*/
int wmain(int argc, wchar_t *argv[])
{
// all parameters are required
//
if (argc != 5)
{
fwprintf(stderr, L"Usage: %s \\\\Domain UserName Password Path\n", argv[0]);
return 1;
}


HANDLE hToken = NULL;

PROCESS_INFORMATION pi;
STARTUPINFOW si;

ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);

int lResult = 0;

__try
{

// Retrieve a handle to the process token with the proper access.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES |
TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY,
&hToken))
{
lResult = DisplayError(L"OpenProcessToken");
__leave;
}

if (!SetPrivilege(hToken, SE_TCB_NAME, TRUE))
{
lResult = DisplayError(L"SetPrivilege");
__leave;
}

// Try to logon as other user
CloseHandle(hToken); // Close the opened handle
hToken = NULL;
if (!LogonUserW(
argv[2], // username
argv[1], // domain
argv[3], // password
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken))
{
lResult = DisplayError(L"LogonUser");
__leave;
}

if (!CreateProcessAsUserW(
hToken,
NULL,
argv[4],
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si, &pi))
{
lResult = DisplayError(L"CreateProcessAsUser");
__leave;
}

}
__finally
{
// Close the opened handles.
if (hToken)
CloseHandle(hToken);
if (pi.hProcess)
CloseHandle(pi.hProcess);
if (pi.hThread)
CloseHandle(pi.hThread);
}

return lResult;
}

BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
TOKEN_PRIVILEGES tp;
ZeroMemory(&tp, sizeof(tp));

if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;

// Look up the LUID for privilege.
if (!LookupPrivilegeValue(NULL, lpszPrivilege,
&tp.Privileges[0].Luid))
{
return FALSE;
}

// Enable privilege in the process token.
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0))
{
return FALSE;
}
return TRUE;
}


int DisplayError(WCHAR* szAPI)
{

LPWSTR szErrorMsg;
DWORD dwErrorCode = GetLastError();

// Format the error message.
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR) &szErrorMsg,
0, NULL);

// Display the error message.
wprintf(L"%s failed:\n\t%s\n", szAPI, szErrorMsg);

// Free the buffer.
LocalFree( szErrorMsg );

return dwErrorCode;
}

PM MAIL   Вверх
man2002ua
Дата 14.5.2003, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



значится так. Насколько мне известно, привилегии SE_TCB_NAME и т.п. либо есть, либо нет и добавить их нельзя, можно только разрешить. Раз добавить нельзя смотрим у кого они есть. О! У системных процессов они есть - замечательно! Значит, чтобы выполнить процедуры LogonUser и CreateProcessAsUser нам надо воспользоваться одним из кучи системных процессов - например spoolsv.exe - никто, кроме принтера, на это не обидится, а если мы будем работать аккуратно, то он даже не заметит smile.gif
Собственно и все - достаточно написать DLL, В к-й выполняются LogonUser и CreateProcessAsUser и внедрить ее в spoolsv.exe.

Должно работать даже для NT. Удачи - у меня пример заработал smile.gif


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Doc_d0s
Дата 30.7.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



Цитата(ng_softman @ 10.5.2003,  18:35)
Вот код, который сначала устанавливает SE_TCB_NAME, потом пытается выполнить LogonUser результат один и тот же.

А вот CreateProcessWithLogonW работает на ура, но только под w2k и выше.

#ifndef UNICODE
#define UNICODE
#endif

#include "windows.h"
#include "stdio.h"
#include "ntsecapi.h"

int SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege);

int DisplayError(WCHAR* szAPI);

/*
    argv[1] - domain
    argv[2] - user name
    argv[3] - password
    argv[4] - path to executable file
*/
int wmain(int argc, wchar_t *argv[])
{
    // all parameters are required
    //
    if (argc != 5)
    {
  fwprintf(stderr, L"Usage: %s \\\\Domain UserName Password Path\n", argv[0]);
  return 1;
    }


    HANDLE hToken = NULL;

    PROCESS_INFORMATION pi;
    STARTUPINFOW si;

    ZeroMemory(&pi, sizeof(pi));
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    int lResult = 0;

    __try
    {
  
  // Retrieve a handle to the process token with the proper access.
  if (!OpenProcessToken(GetCurrentProcess(), 
    TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES | 
    TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY,
    &hToken)) 
  {
    lResult = DisplayError(L"OpenProcessToken");
    __leave;
  }

  if (!SetPrivilege(hToken, SE_TCB_NAME, TRUE))
  {
    lResult = DisplayError(L"SetPrivilege");
    __leave;
  }

  // Try to logon as other user
  CloseHandle(hToken); // Close the opened handle
  hToken = NULL;
  if (!LogonUserW(
    argv[2], // username
    argv[1], // domain
    argv[3], // password
    LOGON32_LOGON_INTERACTIVE,
    LOGON32_PROVIDER_DEFAULT,
    &hToken))
  {
    lResult = DisplayError(L"LogonUser");
    __leave;
  }

  if (!CreateProcessAsUserW(
    hToken,
    NULL,
    argv[4],
    NULL,
    NULL,
    FALSE,
    NORMAL_PRIORITY_CLASS,
    NULL,
    NULL,
    &si, &pi))
  {
    lResult = DisplayError(L"CreateProcessAsUser");
    __leave;
  }

    } 
    __finally 
    {
  // Close the opened handles.
  if (hToken) 
    CloseHandle(hToken);
  if (pi.hProcess) 
    CloseHandle(pi.hProcess);
  if (pi.hThread) 
    CloseHandle(pi.hThread);
    }
    
    return lResult;
}

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
    ) 
{
    TOKEN_PRIVILEGES tp;
    ZeroMemory(&tp, sizeof(tp));

    if (bEnablePrivilege)
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
  tp.Privileges[0].Attributes = 0;

    // Look up the LUID for privilege.
    if (!LookupPrivilegeValue(NULL, lpszPrivilege, 
  &tp.Privileges[0].Luid)) 
    {
  return FALSE;
    }

    // Enable privilege in the process token.
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) 
    {
  return FALSE;
    }
    return TRUE;
}


int DisplayError(WCHAR* szAPI)
{

   LPWSTR szErrorMsg;
   DWORD  dwErrorCode = GetLastError();

   // Format the error message.
   FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER 
         | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErrorCode,
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR) &szErrorMsg,
         0, NULL);

   // Display the error message.
   wprintf(L"%s failed:\n\t%s\n", szAPI, szErrorMsg);

    // Free the buffer.
    LocalFree( szErrorMsg );

    return dwErrorCode;
}

тем не менее у меня на XP sp2 не работает( 
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
NextAlex
Дата 31.7.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



завтра выложу рабочий

Добавлено @ 20:02 
код в аттаче
кстати для того чтобы всё работало в системе должна быть запущена служба "Вторичный вход в систему". 

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  runAs.zip 33,61 Kb
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.