• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-10-19 18:05 Aet 隐藏边栏 |   抢沙发  18 
文章评分 1 次,平均分 5.0

Windows用户权限

标准用户

  1. 普通用户的权限被限制,以防止他们进行可能影响系统稳定性、安全性或其他用户的操作
  2. 不能修改系统设置,例如时间、日期或安装新的设备驱动程序
  3. 普通用户可能无法安装或卸载应用程序
  4. 只能访问自己的文件和某些公共文件,但不能访问其他用户的文件或系统文件
  5. 普通用户不能执行需要管理员权限的系统任务,如关机计算机、管理系统服务或查看安全日志

管理员用户

  1. 具有对系统的完全控制权,可以执行任何操作
  2. 可以更改所有系统设置
  3. 可以安装、更新或卸载应用程序和设备驱动程序
  4. 可以访问、修改或删除任何文件,包括其他用户的文件和系统文件
  5. 可以创建或删除用户账户、分配用户权限和管理系统服务
  6. Windows Vista及更高版本中,尽管管理员有完全的系统权限,但他们仍然受到用户帐户控制(UAC)的约束,该控制要求管理员在进行可能影响系统的操作时进行确认

LocalSystem

  1. 这是一个高权限的服务账户,用于运行Windows的核心服务
  2. LocalSystem账户的权限甚至超过了管理员
    1. 它几乎可以在系统上做任何事情
  3. 尽管此账户具有广泛的权限,但它主要是为系统服务和应用程序使用的,并不建议用户或管理员使用此账户

问题

  1. 普通用户调起的程序,无法通过CreateProcess调起需要管理员权限的exe
    1. 可以使用ShellExecuteShellExecuteEx,传runas,请求管理员权限
    2. 这种调起方式会弹出UAC窗口
  2. 对于自解压程序,由于启动后,实际上它先是做了解压动作,然后调起了解压后的某个exe,导致我们创建的进程很快结束返回了,无法通过创建的进程句柄来监控目标进程。
    1. 使用job内核对象对创建的进程进行关联,以完成端口来等待所有进程结束。

实例

简述

  1. 在进程A里面根据权限创建进程,来调起目标exe,如下:
    1. 如果需要管理员权限,就调起这个helper.exe,并参数传过去,让helper.exe在它里面去用ShellExecute方式去请求管理员权限
    2. 如果不需要管理员权限,就用CreateProcess来调起这个目标exe,有权限有成功,没权限就失败

管理员权限

  1. 为什么管理员权限通过helper.exe来调?
    1. 因为直接在上面使用ShellExecute来请求管理员权限,返回的是创建的进程的句柄。这对于普通程序来说是够用了
    2. 但是我这里去操作的是安装,卸载程序。我在调试过程中发现,部分安装包,卸载程序是自解压程序,也就是调起该程序后,它会调起其他的exe,而它调起的其他的exe,我们获取句柄是比较麻烦的
    3. 而我的需求是调起这个程序后,要阻塞到它完全结束。所以直接用ShellExecute方式来创建的进程,在面对自解压程序时,表现为:我们创建的程序马上结束返回了,但是该进程在结束之前创建了一个其他的进程来真正的做事情。这样的话,用WaitForSingleObject监控不了,因为不知道那个子进程的句柄。
    4. 当然也可以创建进程快照,匹配进程名以及命令行参数的方式来定位的目标进程,但是这样的方式又繁琐,还涉及权限,如果我们一开始调起的进程是普通用户权限的话,后面在通过ReadProcessMemory读取进程命令行参数什么的,会失败。
    5. 所以呢,得使用CreateProcess来创建目标进程,在创建的时候,传参数CREATE_SUSPENDED,让进程先暂停,等我们把创建的进程和job对象关联后,再让进程ResumeThread
    6. 这样,该进程创建的子进程,我们就可以跟踪到了。

普通权限

  1. 这个比较清晰,就是去创建进程,成功就成功,失败就失败

helper.exe

  1. 设置了一个单实例
  2. 然后验证了命令行,因为主要靠命令行来调起
  3. 创建了job内核对象和一个JOBOBJECT_ASSOCIATE_COMPLETION_PORT对象,并把他们关联到了一起
    1. 这使得程序可以接收关于Job状态的通知
  4. 这样目标exe启动后创建的所有进程,job都有感知
  5. 而当这些所有的进程都结束后,通过这个GetQueuedCompletionStatus来感知状态
    1. 使用GetQueuedCompletionStatus来等待Job的完成状态。
    2. 当所有的进程都完成时,它将收到JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO消息

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2023-11-12
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享