设为首页 收藏本站
查看: 1550|回复: 0

Win7下超级管理员创建普通权限任务

[复制链接]

尚未签到

发表于 2015-5-19 12:27:40 | 显示全部楼层 |阅读模式
  项目中用到一个功能,Win7下超级管理员创建普通权限任务.
  试了几种办法,例如获取资源管理器的Token,然后以这个Token用CreateProcessWithTokenW创建任务。这样做是可以的.
  但是如果当前没有资源管理器或者其他普通权限的任务怎么办?CreateToken自己构造一个Token也可以,但是那些参数看了就头大.
  

  试了一下以超级用户方式启动任务管理器用菜单中的运行,居然是默认创建普通权限任务,有一个复选项是以超级用户权限启动任务.
  用WINDBG跟踪了一下.发现任务管理器调用的是WdcRunTaskAsInteractiveUser这个函数.函数位域wdc.dll中.
  函数的形式分析出来如下:
  Delphi声明:

  





[delphi] view plaincopy

  • function WdcRunTaskAsInteractiveUser ( pwszCmdLine, pwszPath : PWIDECHAR;   
  •                                        dwDummy : DWORD):HResult; stdcall; external 'wdc.dll';  
C++声明:  



[cpp] view plaincopy

  • HRESULT WINAPI WdcRunTaskAsInteractiveUser (LPCWSTR pwszCmdLine,   
  •                                             LPCWSTR pwszPath,   
  •                                             DWORD dwDummy);  
  

  这是一个微软没有公开的函数.在MSDN和谷歌上都找不到.
  

  这个函数用起来参数非常少,也很简单.
  最后一个参数任务管理器给的是39.应该是用位来标识的.39应该是 32 or 4 or 2 or 1得到的.
  我试过如果给0,打开EXE等是没问题的,但是打开MP3等会失败.
  

  用IDA反编译WdcRunTaskAsInteractiveUser发现他的实现方式是创建一个低权限的计划任务,然后调用计划任务的Run方法,

  

  另外还有一个小插曲.我认为Vista和Windows7差不多,就判断Windows版本>=6就用WdcRunTaskAsInteractiveUser,否则调用ShellExecuteExE.
  结果发现Vista上不行,Vista上没有这个函数,甚至没有wdc.dll.Vista的进程管理器也不能在超级用户权限下创建普通进程,它仅仅是简单的调用了ShellExecuteEx.
  当然Vista下我们可以自己用计划任务来创建普通权限进程任务,然后Run之.也就是自己实现一遍WdcRunTaskAsInteractiveUser.
  我比较懒,项目中只要GetProcAddress找不到WdcRunTaskAsInteractiveUser ,我就用ShellExecuteEx了.
  

  下面给出我在项目中封装的一个执行代码.



[delphi] view plaincopy

  • function RunTaskAsInteractiveUser(cmdLine, Param, dir: String): Boolean;  
  • const  
  •   wdc = 'wdc.dll';  
  • type  
  •   TWdcRunTaskAsInteractiveUser = function(pwszCmdLine, pwszPath: PWideChar;  
  •     dwDummy: DWORD): HResult; stdcall;  
  • var  
  •   WdcRunTaskAsInteractiveUser: TWdcRunTaskAsInteractiveUser;  
  •   fullname: string;  
  •   sei: SHELLEXECUTEINFO;  
  •   e: Integer;  
  •   hwdc: Cardinal;  
  • begin  
  •   Result := False;  
  •   SetLength(fullname, Length(cmdLine));  
  •   CopyMemory(PChar(fullname), PChar(cmdLine), ByteLength(cmdLine));  
  •   //如果Windows版本>=6  
  •   if Win32MajorVersion >= 6 then  
  •   begin  
  •     hwdc := GetModuleHandle(wdc);  
  •     if hwdc = 0 then  
  •       hwdc := LoadLibrary(wdc);  
  •     @WdcRunTaskAsInteractiveUser := GetProcAddress(hwdc,    'WdcRunTaskAsInteractiveUser');  
  •   
  •     //如果能找到WdcRunTaskAsInteractiveUser那么就应该是Windows7  
  •     if Assigned(WdcRunTaskAsInteractiveUser) then  
  •     begin  
  •       if Length(Param) > 0 then  
  •         fullname := format('"%s" %s', [fullname, Param]);  
  •       // fullname + '  ' + Param;  
  •       // 最后一个参数39是逆向出来的.不知道含义.TaskMgr给的就是固定的39  
  •       // 如果给0的话,EXE等是可以启动的,但是文件夹,MP3等启动不了  
  •       e := WdcRunTaskAsInteractiveUser(PChar(fullname), PChar(dir), 39);  
  •       Result := e = S_OK;  
  •     end;  
  •   end;  
  •   //如果没执行成功,通常就是没有WdcRunTaskAsInteractiveUser,可能系统是Vista或者XP  
  •   if not Result then  
  •   begin  
  •     //  
  •     ZeroMemory(@sei, sizeof(sei));  
  •     sei.cbSize := sizeof(SHELLEXECUTEINFO);  
  •     sei.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;  
  •     sei.lpFile := PChar(fullname);  
  •     sei.lpVerb := 'Open';//如果这里给'runas'可以以超级用户权限启动  
  •     sei.nShow := SW_SHOW;  
  •     if Length(Param) > 0 then  
  •       sei.lpParameters := PChar(Param)  
  •     else  
  •       sei.lpParameters := nil;  
  •     sei.lpDirectory := PChar(dir);  
  •     ShellExecuteEx(@sei);  
  •     if sei.hProcess  0 then  
  •       CloseHandle(sei.hProcess);  
  •   
  •   end;  
  • end;  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-68512-1-1.html 上篇帖子: Win7下程序结束为何没有调用 DLL_PROCESS_DETACH? 下篇帖子: [wxWidgets] 在windows下使用xp/vista/win7风格
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表