Windows下创建进程的理解

news/2024/11/28 17:54:15/

创建windows进程,需要考虑两个点,即session和权限问题。了解这两点,网络上服务创建界面进程,管理员权限进程创建普通权限进程的代码则很好理解。

1、基础知识

        (1) session

        (2) 权限

        CreateProcessAsUser需要传入一个token,而token即用户的主令牌

        用户的主令牌包含以下信息:

                - 用户的安全标识符(SID):唯一地标识了这个用户。

                - 用户的权限:决定了用户可以访问哪些资源和执行哪些操作。

                - 用户的组成员资格:决定了用户可以访问哪些资源和执行哪些操作。

                - 用户的特权:允许用户执行一些需要特殊权限的操作,例如修改系统时间、关闭系统等。

        用户的主令牌是一个非常重要的概念,它决定了用户可以访问哪些资源和执行哪些操作。在 Windows 中,每个进程都有一个访问令牌,它包含了进程的安全上下文信息。当使用 CreateProcessAsUser 函数启动一个新进程时,新进程会继承调用进程的访问令牌,也就是说,新进程的安全上下文信息与调用进程的安全上下文信息相同。如果需要在新进程中使用不同的安全上下文信息,就需要使用 hToken 参数来指定一个不同的访问令牌。

2、创建进程代码分析

        (1) 服务创建界面进程

bool ServerRunWndProcess(LPSTR lpExePath) {HANDLE hToken = NULL;//获取当前服务的令牌OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);HANDLE hTokenDup = NULL;//复制服务的令牌,创建一个新的令牌DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &hTokenDup);//设置新令牌的session信息,为当前登录的用户session,实现session跨越SetTokenInformation(hTokenDup, TokenSessionId, &WTSGetActiveConsoleSessionId(), sizeof(DWORD);CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);//指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。STARTUPINFO si;ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.lpDesktop = ("WinSta0\\Default");si.wShowWindow = SW_SHOW;si.dwFlags = STARTF_USESHOWWINDOW;//创建进程CreateProcessAsUser(hTokenDup, NULL, lpExePath, NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &processInfo);DestroyEnvironmentBlock(pEnv);...
}

        上例中实现的是在windows服务中创建界面进程。

        直接调用ShellExecuteA拉起的界面进程,屏幕上是无法看不到界面的,但在任务管理器的详细信息中能找到进程,是因为它生成在session0中了。

        上述代码使用了Active Console的session id,实现了跨session的进程创建,因此界面程序可以在屏幕上看到。

        但能看到的是,该界面程序的用户名一栏是SYSTEM,因为复制了服务的token,所以服务的权限也被复制过来了。

        (2) SYSTEM/管理员权限进程以普通权限打开进程

bool StartProcess(LPSTR lpExePath) {//获取会话 ID 指定的登录用户的主要访问令牌,该令牌即普通权限WTSQueryUserToken(WTSGetActiveConsoleSessionId(), &hToken);DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenDup);CreateEnvironmentBlock(&lpvEnv, hTokenDup, TRUE);STARTUPINFO si;ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.lpDesktop = "winsta0\\default";CreateProcessAsUser(hTokenDup, process_absolute_path.c_str(), NULL, NULL, NULL,FALSE, CREATE_UNICODE_ENVIRONMENT | NORMAL_PRIORITY_CLASS, lpvEnv, NULL, &si, &pi);DestroyEnvironmentBlock(pEnv);...
}

上述代码,就只是通过WTSQueryUserToken,获取到了一个普通权限的token。复制该token打开进程就是普通权限了。

备注:

创建进程环境是lpDesktop为什么是("WinSta0\\Default")


http://www.ppmy.cn/news/615766.html

相关文章

【小程序】如何手动绘制分享用的图片

上一篇【小程序】如何实现滑动翻页中介绍了如何在小程序中实现上下滑动翻页的效果。 如果要给这个产品增加一个生成图片用于分享到朋友圈的功能,又该如何实现呢? 先来看一下最终的效果图: 首先,新建一个页面(page&am…

时间之外-沉睡者 - 2022/2/24

用CSDN来保存自己觉得不错的资源,包括安全软件,视频软件,小工具等等 推荐阅读: 虚拟资源项目,小白就能在互联网上创业 宝妈就能在网络上一天赚1000的项目解密 ---------------------------------- 文章来源&#x…

计算之魂 (1.1 - 1.2)

这两节中,主要讲述了高德纳所做的贡献,其将算法严格量化衡量,使之成为后来计算机界衡量算法的业内标准。其中印象最深的一句话是计算机就是为了处理庞大数据而生的,所以算法的考虑只需要考虑无穷大的情况,计算机科学家…

勇士冒险游戏

#include<bits/stdc.h> #include<windows.h> #include<conio.h> #include<fstream> using namespace std;//角色信息 struct person {char name[255];int health;int maxhealth;int attack;int defence;int speed;int attention;int magic;int maxmag…

Redis之击穿、穿透、雪崩问题

目录 缓存问题之缓存击穿 击穿解释&#xff1a; 击穿&#xff1a;高并发量的同时key失效&#xff0c;导致请求直接到达数据库&#xff1b; 解决方法&#xff1a; 缓存问题之缓存穿透 穿透解释&#xff1a; 穿透&#xff1a; 很多请求都在访问数据库一定不存在的数据&…

【UE4】实现《黑暗之魂》背刺攻击——如何判断攻击位置?!

这次分享一个我在DynamicCombatSystem里面学来的一个功能——就是判断攻击的位置&#xff0c;例如在黑暗之魂中玩家经常要用到背刺&#xff0c;那么就得站到敌人的背后进行攻击&#xff0c;如何判断玩家是在敌人的背后呢&#xff1f; Step1 创建一个枚举&#xff0c;有四个位置…

《黑暗之魂3》的游戏设计思路

动作游戏基础概念 动作游戏的深度与宽度 宽度 简单&#xff1a;游戏可能出现情况的和 等价&#xff1a;可能空间 例如&#xff1a;黑魂中的普攻、战技、魔法、咒术、盾反、翻滚或滑步、不同武器的不同动作模组、小怪的AI和设计、玩家之间的入侵玩法、Boss的设计等等每一种可能&…

NoSQL之redis缓存雪崩、穿透、击穿概念解决办法

目录 一&#xff1a;缓存雪崩 1.1概念理解 1.2解决方案 1.2.1数据预热 1.2.2缓存层高可用 1.2.3做二级缓存&#xff0c;或双缓存策略 1.2.4缓存业务添加限流和服务降级策略 1.3举例 二&#xff1a;缓存穿透 2.1概念理解 2.2解决方案 2.2.1缓存空值 2.2.2布隆过滤器…