vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)相关的知识,希望对你有一定的参考价值。

背景
      vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵。下面说的都是在vista开启UAC的前提下说的,win7也适用。
      在vista下,系统开启了UAC,如果你的软件通过manifest进行了提权(提升到管理员权限),那么exe上面会打上一个“小盾”的图标,这种程序启动的时候,会激活UAC保护机制,弹一个全局对话框出来询问用户是否允许启动,这就是微软标榜的灰常灰常的安全,到底安全不安全,先不讨论了,呵呵!现在一切都很和谐,没有问题,多点一下就多点下呗,但是如果你的程序是一个开机启动程序,而且通过manifest提升到了管理员权限,开机启动的时候,问题就来了,会直接被Windows Defender拦截下来不予启动,够邪恶吧,不幸的是QQ医生也遇到了这个问题,造成vista开机启动后QQ医生的实时保护程序起不来。不过360的保护程序貌似没有这个问题。那就研究下360吧。

 

 

解决方案
      360的托盘程序360tray.exe没有通过manifest提权,因为它上面没有小盾啊(这个秘密我一般不告诉别人),但是通过ProcessExplorerNT查看360tray的权限,发现它有管理员权限,说明它是动态提权的,那可以猜测360tray.exe在内部把自己重新启动了一次,用OD把360tray跑起来,fc居然被保护了,调试不了,把360tray.exe拷贝到桌面,再调试,嘿嘿,顺利运行,下了几个API断点,主要是CreateProcessA,CreateProcessW,ShellExecuteA,ShellExecuteW,ShellExecuteExA,ShellExecuteExW……反正就是起进程的几个API都bp下来,在UAC开启的情况下,最终会在某个ShellExecuteExW下断下来,此时观察ShellExecuteExW的参数(它的参数是一个结构体指针,此处是将指针ESP+20放入了ECX中,而ESP+20处mov了0x3c进去,也就是SHELLEXECUTEINFOW的大小,和我们平时调用不同是,lpVerb传入了一个字符串"runas",很诡异),如下图所示:

 

技术分享


      答案基本明了了,在Windows Vista里面,ShellExecuteExW lpVerb的参数可以传入一个runas命令,使得系统调用 ShellExecuteEx的时候,会将目标文件强制完全admin模式启动,即使目标文件的manifest没有申明需要完全admin权限。 效果和在目标程序上右键单击,然后选择 run as administrator 菜单运行效果一样。
      事实胜于雄辩,马上写了个程序测试了一下,果然……

 

 

[cpp] view plain copy
 
  1. // 判断命令行  
  2.  if (0 == ::lstrcmp(AfxGetApp()->m_lpCmdLine, TEXT("-uac")))  
  3.  {  
  4.   TCHAR szPath[MAX_PATH] = {0};  
  5.   ::GetModuleFileName(NULL, szPath, MAX_PATH);  
  6.   SHELLEXECUTEINFO sei = {0};  
  7.   sei.cbSize = sizeof(SHELLEXECUTEINFOW);  
  8.     
  9.   sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;     
  10.     
  11.   sei.lpFile = szPath;  
  12.   sei.lpVerb = TEXT("runas");  
  13.   sei.lpDirectory = NULL;  
  14.   
  15.   ShellExecuteEx(&sei);  
  16.   return FALSE;  
  17.  }  

 

      看来我们只要在vista下实现一个一般权限应用程序,然后在启动时,内部根据参数判断用runas传入ShellExecuteEx来重新启动自己,此时会弹一个UAC的对话框出来,但是总比被直接拦截了起不来要好。内部可以判断需要提权的时候才提权(或者简单点不判断是不是需要提权,只判断系统,vista以其以上版本系统下直接用runas启动也行)。360下有个判断uac是否开启的函数,还没有时间跟进去,具体原理还不明,有时间再跟下。

http://blog.csdn.net/magictong/article/details/4804862

 

以上是关于vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)的主要内容,如果未能解决你的问题,请参考以下文章

Vista/7 UAC:如何降低进程权限

在 vista 中避免 UAC

如果路径受到保护,请求 Windows Vista UAC 提升?

用于 DLL 的 Vista UAC

C++编译出来的程序怎么绕过uac盾牌

VC++ Windows7及以上系统中管理员权限与UAC虚拟化详解(附源码)