ShellExecuteEx提升子进程权限

发布时间:2018年2月6日 作者:未知 查看次数:335


ShellExecuteEx提升子进程权限



ShellExecuteEx函数原型  

BOOL ShellExecuteEx(  

  _Inout_  SHELLEXECUTEINFO *pExecInfo  

);  

  

SHELLEXECUTEINFO结构:  

typedef struct _SHELLEXECUTEINFO {  

  DWORD     cbSize;    //这个是结构体大小,sizeof下SHELLEXECUTEINFO就行  

  ULONG     fMask;  

  HWND      hwnd;     //主进程的窗口句柄,一般没用  

  LPCTSTR   lpVerb;      //设置成runas就可以以管理员身份运行了,其他的都是普通用户身份  

  LPCTSTR   lpFile;      //要运行的文件  

  LPCTSTR   lpParameters;                 //要运行的文件的参数  

  LPCTSTR   lpDirectory;  

  int       nShow;   //设置窗口显示(SW_SHOW)和不显示(SW_HIDE),当然还有其他的  

  HINSTANCE hInstApp;  

  LPVOID    lpIDList;  

  LPCTSTR   lpClass;  

  HKEY      hkeyClass;  

  DWORD     dwHotKey;  

  union {  

    HANDLE hIcon;  

    HANDLE hMonitor;  

  } DUMMYUNIONNAME;  

  HANDLE    hProcess;            //返回子进程句柄  

} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;


通过系统API ShellExecuteExW函数提权,向其参数lpVerb传入一个“runas”命令提权(出现UAC提示框

(http://lgy-047.blog.163.com/blog/static/613465652013924102256476/)

SHELLEXECUTEINFO si;

si.cbSize = sizeof(si);

si.fMask = 0;

si.hwnd = NULL;

si.lpVerb = _T("runas");//关键是这里,不是一般的open。

si.lpFile = _T("Proc.exe");//指定要调用的程序

si.lpParameters = strCmd;//设置参数

si.lpDirectory = path;

si.nShow = SW_SHOWNORMAL;

si.hInstApp = NULL;

si.lpIDList = NULL;

si.lpClass = NULL;

si.hkeyClass = NULL;

si.dwHotKey = 0;

si.hIcon = NULL;

si.hProcess = NULL;

ShellExecuteEx(&si);


======================================

win7中的Uac与开机自动启动

https://www.cnblogs.com/findumars/p/4718995.html


给Exe加上Uac的方法,在使用的过程中我们会发现,如果把带Uac的Exe写入注册表的Run中,是无法实现开机自动启动的,原因就是带Uac的exe需要申请管理员权限,以便运行执行程序,而在开机时无法申请到管理员权限,Exe将无法正常启动。那么如何使带Uac的Exe开机自动启动呢。
既然带Uac的Exe开机无法申请到管理员权限,那么可以新建一个不带Uac的小程序,在其中实现申请管理员权限启动exe不就可以解决问题了吗?实现方法如下:(delphi)




unit DyjStartMainForm;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ShellAPI;

const

  WM_STARTCLOSE = WM_USER + 100;

type

  TFrmDyjStart = class(TForm)

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  protected

    procedure WMStartClose(var Msg: TMessage); message WM_STARTCLOSE;

  public

    { Public declarations }

  end;

var

  FrmDyjStart: TFrmDyjStart;

implementation

{$R *.dfm}

procedure TFrmDyjStart.FormCreate(Sender: TObject);

begin

  PostMessage(Self.Handle, WM_STARTCLOSE, 0, 0);

end;

procedure TFrmDyjStart.WMStartClose(var Msg: TMessage);

var

  _vPathExe : string;

begin

  _vPathExe := ExtractFilePath(Application.ExeName) + 'Dyj2.exe';

  ShellExecute(0, 'runas', PChar(_vPathExe), nil, nil, SW_SHOWNORMAL);

  Application.Terminate;

end;

end.

--------------------------------------------

还可以使用services的方式来实现:
把程序的功能分成两部分,界面和不需要管理员权限的功能部分写成一个程序,实现自启动;需要管理员权限的部分写成一个服务,安装后随系统自启动。两者用进程外COM的方式进行讯。

--------------------------------------------

在网上找资料,发现有几种方法:

通过系统API ShellExecuteExW函数提权,向其参数lpVerb传入一个“runas”命令(注:该命令是微软的一个隐藏参数),可以实现开机启动,并出现UAC提示框,但软件起来后,一些功能无法正常使用(实测:上面的例子就是弹出一个UAC对话框,需要点击后方可运行,运行后没发现有什么功能限制);
通过微软自己发布的第三方软件Application Compatibility Toolkit添加UAC白名单方式。同样可以实现开机启动,与1方法不同没有UAC提示框而直接启动,但问题如1一样,一些功能无法正常使用;
通过win7系统自己的“系统工具”中的“计划任务”来手动添加。此方法可以实现程序开机启动,没有提示框,程序所有功能都能正常实现。

--------------------------------------------

对于Win7开机自启动,就是你们说的方法。我想提醒一点,恶意软件会破坏我们的“监控软件”,使其不能开机自启动。
解决方法是把我们的驱动设置为boot类型。boot类型的驱动是启动最早的驱动程序,在系统引导时就必须加载完毕。这样我们的驱动先取得控制权,随后HOOK一些关键函数(比如驱动加载、进程结束等函数),恶意软件无法破坏。一些杀掉软件也是这么做的,比如江民、瑞星、卡巴等。




版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110