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. sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
  9. sei.lpFile = szPath;
  10. sei.lpVerb = TEXT("runas");
  11. sei.lpDirectory = NULL;
  12. ShellExecuteEx(&sei);
  13. return FALSE;
  14. }

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

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

时间: 2024-10-27 00:31:40

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

(转0CentOS下开机启动查看管理命令:chkconfig用法

CentOS下开机启动查看管理命令:chkconfig用法 CentOS下开机启动查看管理的命令是:chkconfig 1. 开机启动列表查看: chkconfig --list 说明:输出所有服务列表,如果列表中没有你要启动的服务 2. 添加服务: chkconfig --add servicename 3. 删除服务: chkconfig --del servicename 4. 查看具体启动服务信息: chkconfig --list  servicename 例如 chkconfig -

window下开机启动多个tomcat配置

tomcat版本都是同一个(解压缩版),此文是参考网上方法,结合自己遇到的实际情况写出的配置步骤,供参考 1.配置java环境变量(此处省略) 2.配置第一个tomcat环境变量 a.新增环境变量:名=CATALINA_TOMCAT1:值:tomcat所在目录(eg:C:\apache-tomcat-6.0.37) b.在path后追加:;%CATALINA_TOMCAT1%\bin 3.修改第一个tomcat的bin目录下的catalina.bat.service.bat.startup.ba

Linux 添加开机启动项的三种方法

linux 添加开机启动项的三种方法. (1)编辑文件 /etc/rc.local 输入命令:vim /etc/rc.local 将出现类似如下的文本片段: #!/bin/sh## This script will be executed *after* all the other init scripts.# You can put your own initialization stuff in here if you don't# want to do the full Sys V sty

linux下tomcat开机启动简单配置

1.个人标记 caicongyang http://blog.csdn.net/caicongyang 2.正文 在linux文件/etc/rc.d/rc.local的末尾加入例如以下行就可以: export JAVA_HOME=/usr/local/jdk export JRE_HOME=/usr/local/jdk /usr/local/tomcat/bin/startup.sh 3.后记 这仅仅是简单.复杂的做法当然是写sh脚本.并将脚本加入为系统服务并配置成开机启动 我的CSDN博客地址

linux系统下开机启动流程

在了解开机启动流程之前,还是得先了解一些磁盘的基本知识.磁盘主要由盘片,机械手臂,磁头,主轴马达构成.盘片就是存储数据的物理单位了.然后盘片上我们可以分成扇区(sector)和柱面(cylinder),每个扇区sector为512Bytes.如下图所示: 磁盘在分区完成之后,每个分区(文件系统)都有一个启动扇区(boot sector),而开机时用到的则是整个磁盘的第一个扇区,这个扇区非常主要,构成如下: (1)主引导分区(MBR)master boot record:446Bytes:系统安装

win7 系统下开机启动

1.开机启动查看 运行: msconfig --> 点击"启动"标签 2.开机项添加:将 .exe/.bat 等运行文件(或者快捷方式)放入 开始-->所有程序-->Startup  文件夹 例:开机打开某文件夹 先创建 *.bat文件(名字自创),右击文件--编辑,添加以下代码: 打开本地磁盘: start C:\ 打开局域网共享文件(需IP地址): start \\192.168.1.100\share\ 保存文件,将 *.bat文件放入 Startup 文件夹(

linux开机启动服务和chkconfig使用方法(转)

每个被chkconfig 管理的服务需要在对应的/etc/rc.d/init.d 下的脚本加上两行或者更多行的注释. 第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级.如果某服务缺省不在任何运行级启动,那么使用 - 代替运行级. 第二行对服务进行描述,可以用\ 跨行注释. 例如,random.init 包含三行: # chkconfig: 2345 20 80 # description: Saves and restores system entropy pool for

openSUSE下开机自动运行脚本命令的方法

在/etc/init.d/boot.local文件中添加命令.RedHat系统的对应文件是/etc/rc.d/rc.local. 对于Linux系统启动时自动运行的命令或程序,在rh-basedlinux系统,一般常见是放在/etc/rc.d/rc.local中.但SuSELinux没有这个文件,另外也不推荐使用者这样管理启动服务.推荐使用正规的方式来管理服务启动方式. 有人会说,在SuSE系统里,可以放在/etc/init.d/boot.local中,这要看实际情况.因为SuSE的/etc/i

linux开机启动服务和chkconfig使用方法(自定义服务路径启动)

服务概述在linux操作系统下,经常需要创建一些服务,这些服务被做成shell脚本,这些服务需要在系统启动的时候自动启动,关闭的时候自动关闭.将 需要自动启动的脚本/etc/rc.d/init.d目录下,然后用命令chkconfig --add filename将自动注册开机启动和关机关闭.实质就是在rc0.d-rc6.d目录下生成一些文件连接,这些连接连接到/etc/rc.d /init.d目录下指定文件的shell脚本. 在文章linux下Oracle自动启动与停止(一),linux下Ora