Как олицетворять существующий процесс с Win32 API? - PullRequest
0 голосов
/ 18 июня 2019

Я хочу запустить приложение в разных процессах, используя учетные данные каждого вошедшего в систему пользователя, без создания совершенно новых процессов с Win32 API CreateProcessAsUserA(), потому что запуск приложения занимает около минуты, что недопустимо с точки зрения производительности .

  • План A: Запустить несколько процессов ожидания до поступления пользовательских запросов. Олицетворять существующий процесс с заданными учетными данными пользователя.
    Как это сделать?

  • План Б: Я открыт, чтобы услышать другие идеи.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Если ваш процесс имеет только один поток или не много потоков, вы можете использовать SetThreadToken.

  • Сначала LogonUserA или некоторые другие функции используются для получения токена пользователя.
  • Затем DuplicateToken преобразует его в жетон подражания.
  • Получите дескриптор потока и, наконец, вызовите SetThreadToken.

Вот простой пример (уже убирается проверка ошибок для краткости)

Существующий процесс:

#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
    cout << GetCurrentThreadId() << endl;//For example: I get currentthreadid = 17608 this time.
    getchar();
    char user[100] = { 0 };
    DWORD size = 100;
    GetUserNameA(user, &size);
    cout << user << endl;
    getchar();
    return 0;
}

SetThreadToken.cpp:

#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
    HANDLE hToken, DToken;
    BOOL i = LogonUserA("user","domain","password", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT,&hToken);
    HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,false,17608);
    DuplicateToken(hToken, SecurityImpersonation,&DToken);
    SetThreadToken(&hThread, DToken);
    getchar();
    return 0;
}

Если вы хотите установить токен для процесса, существует недокументированный метод NtSetInformationProcess в ntdll.dll, попробуйте ответить в на этот вопрос , чтобы установить токен доступа к процессу.

0 голосов
/ 19 июня 2019

Нет задокументированного / недокументированного способа добиться того, что вы запрашиваете.Есть хакерский способ сделать это, но с серьезным компромиссом в плане безопасности.

Если у вас есть право выдавать себя за другого пользователя, это означает, что ваш процесс работает с самыми высокими привилегиями в Windows.Что вы можете сделать, так это выполнить

  1. Процесс A создает несколько копий процесса B (для запуска которого требуется время) с теми же правами, что и у процесса A. Таким образом, по сути, процесс B также имеет право на олицетворение.
  2. Процесс B установит механизм LPC (канал / сокеты / что угодно), в который процесс A может записывать.Процесс B будет ждать неопределенно долго, пока не получит запрос от процесса A.
  3. Когда запрос поступит, процесс A получит информацию о пользователе и передаст ее процессу B, используя механизм LPC.
  4. ПроцессЗатем B выдаст себя за пользователя, выполнит задачу и завершит работу.

Ни при каких обстоятельствах это не должно использоваться в розничном продукте, поскольку это взлом, который можно легко использовать в зависимости от процесса Bделает.Если вы собираетесь отправить продукт с этим хаком, сообщите нам имя, чтобы мы не использовали его.

...