Windows下创建进程的理解

news2024/9/21 1:41:11

创建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.coloradmin.cn/o/693504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 打卡day45--完全背包问题之最小填充次数

一个人的朝圣 — LeetCode打卡第45天 知识总结Leetcode 70. 爬楼梯题目说明代码说明 Leetcode 322. 零钱兑换题目说明代码说明 Leetcode 279. 完全平方数题目说明代码说明 知识总结 今天的问题都可以归结一句话, 在完全背包的问题设置下, 问将该背包填满最少需要放几件物品. L…

java基础(并发编程)-异步模式之生产者/消费者

一、定义要点 与前面的保护性暂停中的GuardedObject不同,不需要产生结果和消费结果的线程一一对应消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息队列是有容量限制的…

代码随想录算法训练营第17期第1天 | 704. 二分查找、27. 移除元素

从头开始,重新再来,但是又不完全一样,之前是擅长的python,现在是C,能坚持下来么? 704. 二分查找 704. 二分查找https://leetcode.cn/problems/binary-search/ 上次写这道题已经是两个月之前,说…

Openresty原理概念篇(七)OpenResty 中用到的 NGINX 知识

一 OpenResty 中用到的 NGINX 知识 Luaj 是一个 Java 的 Lua 解释器,基于 Lua 5.2.x 版本 luaj ① 说明 1) 本文可有可无原因:如果你之前没有接触过nginx或者涉及一点nginx,那么建议阅读2) 由于自己已经对nginx整个脉络体系进行讲解,本文只是机械的摘录,构成…

Java使用RabbitMQ实战,Springboot使用rabbitMQ实战

文章目录 一、Java原生API1、简单实例2、延迟消息3、消费端限流4、消息属性设置5、消息可靠投递 二、Spring-API1、简单实例(1)引入rabbitMQ.xml(2)生产者(3)消费者(4)测试类 三、Sp…

使用VSCODE跑orbslam2踩的坑

我用的是ubuntu22.04,opencv是4.7,使用其他的库感觉就算版本不一样,也能跑。 一、运行build.sh能够产生可执行文件遇到的问题 1.由于opencv版本高带来的问题 这些问题怎么定位出现在哪些文件中,你通过命令行,运行下…

更灵活的CSS3新特性:帮你简化样式管理和优化网站性能

文章目录 I. 前言:介绍CSS3的进化和发展趋势CSS3的历史和版本CSS3的标准化和浏览器支持情况 II. 新的CSS选择器:扩展选择器的功能属性选择器:更多方式选择元素伪类和伪元素:更方便地定义样式 III. 改进的排版和布局:实…

在 EulerOS 系统中设置 Chrony 时间同步服务

以下是在 EulerOS 系统中设置 Chrony 时间同步服务的所有步骤。 1.查看系统版本 [rootservice11 ~]# cat /etc/redhat-release EulerOS release 2.0 (SP5)2.检查是否已安装chrony软件 [rootservice11 ~]# rpm -qa|grep chrony chrony-3.2-2.eulerosv2r7.x86_64如果没有安装…

Openlayers实战教程学习大纲及引导

本系列教程是Openlayers的实战教程,介绍Openlayes的一些基础知识,并重点讲述哪些地方是openlayers项目中常用的,给出具体示例,起到一个很好的引导学习作用。 版本说明 Openlayers的实战教程 分为**图文版** 和 **视频版**&#x…

【经验分享】全志科技官方Ubuntu16.04根文件系统镜像的替换和测试方法

本文主要基于全志A40i开发板——TLA40i-EVM,一款基于全志科技A40i处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,演示Ubuntu根文件系统镜像的替换和测试方法。 创龙科技TLA40i-EVM评估板接口资源丰富,引出双路网口、双路CAN、双路USB…

7.5_1散列查找(上)

基于一种数据结构: 散列表(Hash Table),又称作哈希表 特点:数据元素的关键字与其存储地址直接相关 其实这个散列表也是基于数组实现的 加入19对13取余 加入再次插入1的话,塞不进去 数据元素不会直接存放到…

深入浅出设计模式 - 适配器模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…

Presto(Trino)分布式(物理)执行计划的生成和调度

文章目录 1.前言2.物理执行生成(Stage)的生成2.1不同的调度分区策略2.1.1 Connector自己提供的分区策略2.1.2 Presto提供的Partition策略(SystemPartitioningHandle): 2.2 为Stage创建StageScheduler2.2.1 普通的非bucket表的TableScan StageSplit 放置策略解析 2.2…

UE5.1.1 c++从0开始(14.用C++写UMG类)

先在这里放一个链接防止第一次看的朋友们不知道我在讲什么:https://www.bilibili.com/video/BV1nU4y1X7iQ/ 这一段的教程不难,唯一新建的C类是UMG的一个类。这个类用来写绑定在ai身上的血条。 总结一下一共做了什么事情: 给ai写了一个血条…

LeetCode Java两个单链表相交的一系列问题

题目描述 单链表可能有环,也可能无环。给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交。 请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回n…

Android 渐变背景色

目录 一、背景 二、渐变 2.1 线性渐变背景色 1.新建资源文件 2.编辑样式文件 3.使用 4.编辑样式参数说明 2.2 圆角按钮渐变背景色 2.3 放射渐变 2.4 扫描线渐变 一、背景 单纯的颜色背景已经不能够满足UI大佬们的发挥,渐变色背景无疑成了一个炫技的方向。现在…

chatgpt赋能python:Python调用同一个类中方法详解

Python调用同一个类中方法详解 在Python编程中,类是一种非常重要的概念,可用于组织和管理代码。在同一个类中,可以定义多个方法。本文将详细介绍如何调用同一个类中的方法。 什么是类方法? 在Python中,类方法是指类…

魔兽世界自己架设任务

在魔兽世界中,玩家可以使用游戏内的任务编辑器自己架设任务来增加游戏的乐趣和挑战性。以下是详细的步骤: 第一步:打开任务编辑器 玩家可以在游戏中按下“ESC”键,进入游戏设置页面。在这个页面中,有一个“编辑器”选…

DSL查询分类与全文检索查询

DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(full text&#x…

Idea新建springboot项目遇到的问题及解决

1.更换阿里云 方法&#xff1a; 找到文件路径&#xff1a;Settings > Build,Execution,Deployment > Build Tools > Maven 如下图&#xff1a; 找到相应的settings文件 如果没有就新建一个同名文件&#xff0c;内容如下&#xff1a; <settings xmlns"h…