20170607Windows09_03_进程

来源:互联网 发布:淘宝能改店铺名称吗 编辑:程序博客网 时间:2024/05/18 02:12

进程权限概述:

1:进程权限是随着计算机发展而出现的产物,权限可以分为几个时期:
    1:DOS时期:所有的程序都可以直接操作物理内存,无论是系统程序还是其他程序,他们都是属于同一等级。(注意:内存(存储的代码),CPU直接执行内存的代码)当其他软件直接操作内存更改了系统使用的内存部分,就会导致CPU执行内存中错误的代码,是非常不安全的,很可能导致系统崩溃。其次,进程间毫无保密性,可以互相访问其操作的内存。
    2:虚拟内存:是为了解决系统会不稳定的问题的,他杜绝了直接修改操作系统代码的可能,只有通过了Windows认证之后的软件才有可能直接和Windwos操作系统的内核打交道,否则其他任何进程都不可以与操作系统内核打交道。
        虚拟内存带来了一个新的产物:进程,进程间一般是无关联的,但不可能毫无关联(例如:输入法和记事本),因此,还是开放了一些接口,但又会导致进程间无保密性(CreateProcess打开子进程,父进程有子进程的访问权限,这样就可以写了个盗号木马,来CreateProcess QQ,访问子进程的时候就可能访问到帐号密码等)。
        因此,微软提供了权限,必须拥有这个权限才能做这些事情(是指用户赋予你的权限),当打开一些软件来做高危操作的时候,他会通知用户,是否允许做这样的事情。但是,最初这样的权限设置并不完善,XP下只划分了管理员权限和用户权限,管理员权限什么事都能做,所以XP用户基本都有管理员权限。
        实际上,权限是这样的:当以管理员权限打开一个进程,那这个进程就拥有管理员权限,管理员权限将会被子进程继承,子进程也拥有管理员权限,这样就导致进程中CreateProcess任何东西,都有管理员权限(非常著名的网页木马,这种木马只能用管理员权限打开才能运行,否则不会运行,IE就拥有管理员权限,IE支持插件功能,插件可以自动被下载和运行,IE来CreateProcess,管理员权限被继承,插件里面任何代码都可能被运行)。
    3:UAC:指管理员权限下新设置的一个带过滤表的一种权限,UAC将不再拥有部分管理员权限,一般管理员权限就不能做UAC限制之外的一些操作(需要拥有全部管理员权限,UAC只是拥有部分管理员权限),现在的木马想要绕过UAC也是非常难的。Windows的权限管理逐渐完善。
        注意:XP下只有两种权限:用户权限和管理员权限,如果以管理员权限启动的进程,这些进程都能够在系统下任意妄为,在vista后,加上了UAC,任何管理员权限运行的程序都不再拥有完全的管理员权限,只能在程序边界上进行权限的提升(只能在进程启动时刻提升权限,启动完成之后是没办法再提升权限的,提升权限的时候,必须通知用户,对于进程的提权都是单次的)。
        鼠标双击打开一个进程,这个就是由资源管理器来CreateProcess的,资源管理器是所有子线程的父进程,在XP下面,以管理员登录后,资源管理器本身就拥有管理员权限,所以打开的所有软件都拥有管理员权限。在UAC之后,资源管理器拥有管理员权限,但是子系统只能够在进程边界提权,提权是一次的,之后双击其他进程,都需要挨个提权。权限不具有记录功能,否则黑客就可能找到记录的东西,copy到自己的进程,就非常不安全了,所有的程序只能够在启动的时候来确定将其提升为管理员,否则,进程在运行过程中是不可以提升权限的。
    
    补充点:
        1:进程边界是一种状态,指的是进程启动时的状态,和权限没有关系,程序边界上提升权限是指在进程启动时提升权限。
        2:用户权限可以看成空的,用户要做任何权限操作都需要登录系统账户,登陆的账户一般为管理员账户、标准用户,登录什么样的账户就代表拥有什么样的权限。
        3:在vista之前,启动进程默认只有标准用户权限,要获取管理员权限就是获取的完全的管理员权限,vista之后获取的权限就是UAC控制的管理员权限,如果以普通标准账户登录系统,打开有的程序可能提示要有管理员认证,此时需要输入管理员密码才可以运行,这就是UAC机制的体现。登陆的账户为管理员账户,打开程序、安装程序可能会提示是否允许(不需要输入密码,已经是管理员登录),也是UAC的体现。如果以超级管理员(administrator)登陆系统,就不会出现任何安全提示,即使UAC开起的也不会有任何安全提示。
        4:用户总共有五种:
1:系统层用户:这些用户是普通人员不能接触到的,但是控制着系统的正常运作。此类用户包括SYSTEM、LOCAL SERVICE等,是系统的强制用户,无法删除。
2:超级管理员用户:即Administrator用户。这个用户是计算机中唯一的超级管理员用户,持有计算机超级管理权限,大多数的操作都需要Administrator用户授权才能够进行。
3:管理员用户:此用户与普通用户的唯一区别是具有更多的计算机管理权限。该用户的管理员权限由Administrator分配,Administrator可以随时将此类用户降级为普通用户。
4:普通用户:用于在计算机上执行普通的动作,进行普通修改,拥有标准权限。
5:Guest来宾用户:供没有密码的客人使用,作临时访问用。此用户一般会被禁用,权限由管理员分配。

进程权限:

1:使用管理员身份运行:
    系统中双击,右键打开,右键以管理员身份打开,都使用资源管理器打开的的进程,这些进程都是windows资源管理器的子进程,这些子进程都是属于独立的子进程,他会自动地消亡(可以认为Windwos资源管理器打开进程成功后,不会等子进程结束,就将进程句柄和线程句柄关闭了(内核对象使用计数变为1),当进程自己返回时,使用计数就变为0,自动关闭了)。进程之间应该是独立的,因此,我们的程序启动的子进程,应该及时关闭句柄。如果项目需要,可以使用WaitForSingleObject等待子进程结束,父进程再开始下面的程序运行。
    以普通管理员或者普通用户登录系统的时候(打开了UAC),打开某些程序就会提示是否允许。
2:通过RM_MANIFEST提升权限:
    是一个附加对象,是UAC文件里面附加的信息,里面会有三个值,在软件下面右键,属性,里面会有一项用管理员身份运行此程序,打勾后运行程序就是更改的RM_MANIFEST结构体里面的这三个值。在VS编程环境中,可以在属性->链接器->清单文件,里面设置UAC执行级别。这样可以自动提升软件的权限。实际上,他是通过修改文件资源里面的一个XML文件里面的数据来实现的。设置的级别分为三种:asInvoker,highestAvailable,requestAdministrator。
3:手动提升权限:
    A程序不具备管理员权限,A进程启动一个需要管理员权限的B进程,这时候,就需要手动提升下一个进程的权限了。手动提升的时候,就不能够使用CreateProcess,他并不具备提权的功能,他只能做到当前权限的向下继承,此时需要使用ShellExecuteEx(),在SHELLEXECUTEINFO结构体内,有对权限的相关设置。
4:权限的继承:
    CreateProcess打开进程的时候,继承规则如下:
        如果是以管理员运行的程序,其CreateProcess的子进程会继承提升后的权限,如果是UAC限定下的程序,CreateProcess的子进程他是一个需要提权的程序,就可能会失败,会返回ERROR_ELEVATION_REQUIRED。
5:
#include <windows.h>#include <iostream>int main(){SHELLEXECUTEINFO sei = { 0 };sei.cbSize = sizeof(SHELLEXECUTEINFO);sei.lpVerb = TEXT("runas");//执行操作设置为runas。sei.lpFile = TEXT("CMD");sei.nShow = SW_SHOW;if (!ShellExecuteEx(&sei)){DWORD dwError = GetLastError();if (dwError == ERROR_CANCELLED){std::cout << "用户取消" << std::endl;}else if (dwError == ERROR_FILE_NOT_FOUND){std::cout << "文件未找到" << std::endl;}}elsestd::cout << "打开成功" << std::endl;system("pause");return 0;}

6:实际测试:使用需要不同权限的控制台程序打开cmd:
    当以超级管理员登录系统时,asInvoker,highestAvailable,requestAdministrator三种权限的exe文件打开都不会做任何提示,直接就能够运行。
    当以普通管理员权限登录系统时:asInvoker的exe文件打开可以正常打开,但是程序里面做的一些操作在执行的时候会提示是否允许,程序里面也可以获取用户点击的是还是否,并做不同的处理,但是该exe是可以正常打开的。打开highestAvailable和requestAdministrator的exe文件时,会提示是否允许未知发布者发布的程序,要么运行要么不运行,不会要求要密码。
    当以标准用户登录系统时,打开asInvoker的exe可以打开,但是程序里面做相应操作的时候会要求输入管理员密码,如果不输入密码确定就视为不允许这个操作,程序会捕捉到用户是否允许,并作相应处理。打开highestAvailable的时候,也是一样的效果,程序运行,但里面的操作可能会提示需要密码,不允许的话,程序也可以捕捉到用户不允许的消息并做处理,打开requestAdministrator级别UAC限制的程序,会直接提示是否要运行,需要管理员密码,不过不允许,程序就不能运行。
    一般情况下,在弹出的对话框的详细信息中会指明程序中的操作危险的原因。





原创粉丝点击