`

Vista/Win7下普通权限进程动态提升权限

    博客分类:
  • VC
阅读更多

Vista/Win7下普通权限进程动态提升权限


本文出自 “碧海笙箫” 博客,请务必保留此出处http://pyhcx.blog.51cto.com/713166/197073


一、前提

在Vista/Win7下,加强了对安全的管理,对注册表修改,系统目录的文件操作,都需要管理员权限才能完成(当然虚拟存储机制,表面上也相当于能操作)。所以,对于程序中有相关操作的,这时候,就要求我们的程序必须拥有管理员权限。通过mainfest文件,我们可以让程序总是需要管理员权限执行,但是,这将导致程序每次运行时,都需要弹出UAC框老骚扰用户,另外,有时候我们的程序只是在某一些时刻才需要管理员权限来运行,大部分时候只要普通权限就可以了。鉴于此,我们有必要让我们的程序,在运行的过程中,动态的来提升权限。


二、原理方法

要动态的提升程序的权限,很遗憾的是,Microsoft并没有提供这样的方法(至少我没找到),也就是,程序的运行权限,在启动时就已经决定了。于是我们想要动态提升权限,理论上是不可能的!


本文章介绍一种方法,来模拟实现这样的功能,让整个程序跑起来,就像是在动态提升权限一样。只要在需要执行管理员权限的操作时,以管理员权限启动一个新进程,把操作交给新进程去完成。启动的新进程,最好就是本进程的新实例,这样在以管理员权限启动的新进程弹出的UAC框上可以看到程序名和数字签名,都能表示就是同一个程序,来达到动态“提升”进程权限的效果。


三、实现


1. 进程启动时,根据命令行参数来区分,是按正常模式启动还是提升权限之后的模式启动。


2. 本身进程与高权限进程之间,产用Message:WM_COPYDATA进行通信,由于Vista/Win7下,限制了不同权限进程之间的发送消息,需要向Window Message Filter添加WM_COPYDATA。

// 允许Vista/Win7下,不同权限进程间发送消息:WM_COPYDATA 

typedef BOOL (WINAPI FAR *ChangeWindowMessageFilter_PROC)(UINT,DWORD);
ChangeWindowMessageFilter_PROC m_pfnChangeWindowMessageFilter; 
m_pfnChangeWindowMessageFilter = (ChangeWindowMessageFilter_PROC)::GetProcAddress (::GetModuleHandle(_T("USER32")),"ChangeWindowMessageFilter"); 
if (m_pfnChangeWindowMessageFilter) 
{ 
	m_pfnChangeWindowMessageFilter(WM_COPYDATA, 1/*Add*/); 
}
 


3. 以高权限启动新进程

// 启动Shell 
OSVERSIONINFOEX OSVerInfo; 
OSVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
if(!GetVersionEx((OSVERSIONINFO *)&OSVerInfo)) 
{ 
         OSVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
         GetVersionEx((OSVERSIONINFO *)&OSVerInfo); 
} 

TCHAR atszVerb[16]; 
if(OSVerInfo.dwMajorVersion >= 6) // Vista 以上 
{ 
         _tcscpy(atszVerb,_T("runas")); 
} 
else 
{ 
         _tcscpy(atszVerb,_T("")); 
} 

USES_CONVERSION; 

SHELLEXECUTEINFO se ; 
memset(&se,0,sizeof(SHELLEXECUTEINFO)); 
se.cbSize = sizeof(SHELLEXECUTEINFO); 
se.lpVerb = atszVerb; 
se.lpFile = W2T(m_bstrShellExe); 
se.lpParameters = atszBootCmd; 
se.nShow = SW_HIDE ; 
se.fMask = SEE_MASK_NOCLOSEPROCESS ; 

if(ShellExecuteEx(&se)) 
{ 
        // 启动成功 
} 
else 
{ 
        // 启动失败,可能UAC没有获得用户许可 
}
 


4. 发送消息执行命令

本进程,通过FIndWindow,查找到高权限进程的主窗口,并向该窗口发送WM_COPYDATA下消息;同时高权限进程处理WM_COPYDATA,根据传送到来的数据,执行相应的功能。


四、Demo

附件所带Demo,提供了一个已经封装好的COM组件(AdminShell.dll),来实现同步/异步的高权限命令执行模式的命令发送模块。同时提供了一个Shell.h头文件,封装实现了命令接收模块。我们只需要实现命令处理函数即可。

Demo实现了同步模式的命令执行,一步模式,只需要响应AdminShell的连接点事件即可。

Demo用VS2008编译,并在Win7下测试通过。

 

附件下载:
  Demo

 

分享到:
评论

相关推荐

    win7/win8/win10 vc过UAC

    标题“win7/win8/win10 vc过UAC”指的是在Windows 7、Windows 8和Windows 10操作系统上,使用Visual C++(vc)编程语言绕过用户账户控制(User Account Control, UAC)的技术。UAC是微软为了增强系统安全而引入的一...

    win7右键获取管理员权限

    同时,可能还会涉及到Token_Elevation_Type,这是Windows Vista及以后版本中引入的一种机制,用于控制进程的权限提升。 此外,该工具提供了多语言版本,这意味着它已经本地化为多种语言,以便不同国家和地区的用户...

    vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离

    例如,创建一个名为AlertService的服务,尽管在服务属性中勾选了"允许服务与桌面交互",但在Win7环境下,服务发出的对话框并不会出现在当前用户的桌面,而是出现在一个独立的Session中,用户无法直接访问。...

    windows 7/8/8.1获取system权限

    在这一机制下,即使用户登录的是管理员账户,其日常操作也是在标准用户权限下进行的,只有在执行特定的系统级任务时,才会请求提升权限。 在Windows系统中,存在三种主要的权限等级:Standard User(标准用户)、...

    系统进程隐藏工具(win7等)

    2. "Vista 关机补丁(Win7误用).reg" - 这是一个注册表文件,可能包含了修改Windows Vista或Windows 7关机行为的设置。由于Windows 7用户可能会误用,这可能是一个警告,提醒用户谨慎操作。 3. "使用说明.txt" - 这个...

    vista和win7用户无法在protel中添加库文件的解决方法

    ### Vista和Win7用户无法在Protel中添加库文件的解决方法 #### 一、概述 随着电子设计自动化(EDA)软件的普及和发展,Protel作为一款广泛应用于电路板设计的专业软件,在电子工程师中有着不可替代的地位。然而,...

    win7/vista session隔离与windows服务

    ### Win7/Vista Session隔离与Windows服务:理解与突破 #### 概述 在Windows操作系统中,服务(Service)作为核心组件,承担着系统后台任务的执行,支持着日常的桌面操作。然而,自Vista及之后的版本,如Windows 7...

    WIN7关闭UAC方法

    ### WIN7关闭UAC方法 #### 一、UAC(用户账户控制)简介 UAC(User Account Control),即用户账户控制,是Windows Vista及之后版本操作系统中的一个安全技术,用于防止未经授权的程序对系统进行更改。在Windows 7...

    win7 vista 下 superCHM等软件异常的解决方案

    总的来说,解决“win7 vista 下 superCHM等软件异常的解决方案”涉及检查系统兼容性、更新软件、验证权限、检查依赖项、排查恶意软件以及可能的源代码分析。通过这些方法,用户或开发者可以逐步定位并修复问题,确保...

    轻松获取管理员权限工具

    这将启动一个提升的进程,该进程拥有管理员权限。 3. 修改UAC设置: 如果频繁需要管理员权限,可以调整UAC的设置。在控制面板中,找到“用户账户和家庭安全”或“用户账户”,然后选择“更改用户账户控制设置”。...

    WIN7下VC6.0调试程序终止进程不能关闭exe

    总之,"WIN7下VC6.0调试程序终止进程不能关闭exe"这个问题需要综合考虑多种因素,通过逐步排除法和尝试不同的解决方案来找出问题的根源。同时,由于VC6.0已经较为老旧,升级到更现代的开发工具,如Visual Studio ...

    Win7系统如何取得文件管理员权限.docx

    在Windows 7操作系统中,有时由于安全策略的设置,普通用户可能会遇到无法修改或删除特定文件或文件夹的情况。这是因为Windows 7为了提高系统安全性,引入了严格的文件权限管理机制,使得只有拥有管理员权限的用户...

    64位/32位 Win7下配置IIS7.5运行ASP+Access网站

    【64位/32位 Win7下配置IIS7.5运行ASP+Access网站】的知识点详解: 在64位或32位的Windows 7操作系统中,配置IIS7.5以运行ASP(Active Server Pages)和Access数据库驱动的网站涉及到多个步骤。以下是一个详细的...

    win7任务管理器以all users 启动

    总的来说,让Win7任务管理器以“all users”或管理员权限启动是一项有用的功能,可以帮助系统管理员更好地监控和管理系统的运行状态。通过理解这些文件的作用,我们可以安全地调整系统设置,以满足高级的管理和监控...

    Win8.1权限获取设置技巧.docx

    在Windows操作系统中,尤其是从Vista版本开始,微软引入了更为严格的权限管理机制,以增强系统的安全性。在Win8.1系统中,即使以管理员身份运行应用程序,有时仍可能遇到权限不足的问题,尤其是在尝试删除某些文件或...

    EPROCESS.rar_EPROCE_EPROCESS_EPROCESS win7_EPROCESS winxp_win 7

    首先,EPROCESS结构包含了进程的核心信息,如进程ID(PID)、进程令牌(Token),这是用来控制进程权限的关键组件。它还包含了进程的基地址空间信息,如虚拟地址描述符表(VAD),这决定了进程可以访问哪些内存区域...

    win7判断管理员身份

    在C#中,可以使用`System.Security.Principal`命名空间下的`WindowsIdentity`和`WindowsPrincipal`类来检查当前进程是否以管理员权限运行。以下代码片段展示了如何实现这一功能: ```csharp using System.Security....

    win7右键管理员

    ### Win7 右键获取管理员权限详解 #### 一、背景与重要性 自Windows Vista开始,微软在操作系统中引入了一系列安全措施来提高系统的安全性。其中最重要的改变之一就是增加了用户账户控制(User Account Control,...

    cad2006\win7系统下安装cad2006的方法.doc

    以下是一份详细的步骤指南,帮助您成功在Win7环境下安装CAD2006。 首先,我们需要开启超级管理员账户,这是由于CAD2006需要高级权限才能顺利完成安装。有两种方法可以实现: 1. 如果您的系统是Windows 7旗舰版,您...

    win7导出xml报错:无法定位程序输入点AddDllDirectory于动态链接库KERNEL32

    标题 "win7导出xml报错:无法定位程序输入点AddDllDirectory于动态链接库KERNEL32" 描述了一个在Windows 7操作系统中常见的错误,该错误发生在尝试导出XML文件时,系统提示找不到`AddDllDirectory`函数的入口点于`...

Global site tag (gtag.js) - Google Analytics