【问题标题】:How to impersonate an existing process with win32 API?如何使用 win32 API 模拟现有进程?
【发布时间】:2019-06-18 17:02:52
【问题描述】:

我想使用每个登录用户的凭据在不同的进程中运行应用程序,而不是使用 Win32 API CreateProcessAsUserA() 创建全新的进程,因为启动应用程序大约需要一分钟,这在性能方面是不可接受的.

  • A 计划:在用户请求进入之前启动一些独立流程。使用给定的用户凭据模拟现有流程。
    该怎么做?

  • B 计划:我愿意听取其他想法。

【问题讨论】:

  • 模拟不会影响进程中的所有内容,因此它取决于您的应用程序所做的事情。
  • 模拟不会影响授予进程的访问权限,例如读/写文件?
  • 是,但不是 CreateProcess 和某些 shell 函数。

标签: authentication winapi process win32-process


【解决方案1】:

没有记录/未记录的方式来实现您的要求。有一种黑客方法可以做到这一点,但会严重损害安全性。

如果您有权冒充其他用户,则意味着您的进程在 Windows 中以最高权限运行。你能做的就是关注

  1. 进程 A 创建进程 B 的多个副本(启动需要时间),并具有与进程 A 相同的权限。因此基本上进程 B 也有权模拟。
  2. 进程 B 将设置进程 A 可以写入的 LPC 机制(管道/套接字/其他)。进程 B 将无限期等待,直到收到进程 A 的请求。
  3. 当请求进来时,进程 A 将获取用户信息并使用 LPC 机制将其传递给进程 B。
  4. 然后进程 B 将模拟用户并执行任务并终止。

在任何情况下都不应该在零售产品中使用它,因为这是一种很容易被利用的黑客,具体取决于流程 B 正在做什么。如果您要使用此 hack 发布产品,请告诉我们名称,以便我们不使用它。

【讨论】:

    【解决方案2】:

    如果你的进程只有一个线程或线程不多,你可以使用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;
    }
    

    如果你想给进程设置一个令牌,ntdll.dll中有一个未记录的方法NtSetInformationProcess,试试this question中的答案设置进程访问令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      相关资源
      最近更新 更多