zoukankan      html  css  js  c++  java
  • 【动态UAC权限】无盾程序(win32&cmd)


    可以看到两种不同的提权方式,注意是动态,用代码提权,而不是用清单文件提前处理。

    函数都写好了,这里不多做解释。


    win32程序:

    首先需要这俩头文件,第二个我忘了啥函数要用了,总之出问题加上就对了:(补:获取程序路径的函数)

    #include <windows.h>
    #include <Shlobj.h>

    检测是否以UAC启动:

    //返回1为管理员权限,0位普通 
    BOOL IsUserAdmin(void){
        BOOL b;
        SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
        PSID AdministratorsGroup; 
        AllocateAndInitializeSid(
            &NtAuthority,
            2,
            SECURITY_BUILTIN_DOMAIN_RID,
            DOMAIN_ALIAS_RID_ADMINS,
            0, 0, 0, 0, 0, 0,
            &AdministratorsGroup); 
        CheckTokenMembership(NULL,AdministratorsGroup,&b);
        FreeSid(AdministratorsGroup); 
        return(b);
    }

    主要部分,此处应注意返回值,程序中应在开头这样编写:

      if(IsUserAdmin()){
            //is UAC
            //什么都不做 
        }
        else{
            //not UAC
            char path[100];
            GetModuleFileName(NULL,path,100);
        
            SHELLEXECUTEINFO execinfo;  
            memset(&execinfo,0,sizeof(execinfo));  
            execinfo.lpFile         =path;  
            execinfo.cbSize         =sizeof(execinfo);  
            execinfo.lpVerb         ="runas";  
            execinfo.fMask          =SEE_MASK_NO_CONSOLE;  
            execinfo.nShow          =SW_SHOWDEFAULT;  
            //execinfo.lpParameters   =NULL;  
      
            ShellExecuteEx(&execinfo);
            CloseHandle(execinfo.hProcess);
            
            exit(0);
        }

    此处的else内就是UAC提权的过程,通过 ShellExecuteEx 函数以UAC权限启动,启动完成后当前程序退出。

    我懒得讲解,不明白的可以查微软文档。


    控制台程序:

    看到没我这么贴心,快来感谢我。

    头文件不用多说:

    #include <stdio.h>
    #include <windows.h>

    还是让我多说了,唉,我真是太好了

    控制台的参数可以直接获得程序路径,就不用其它函数了,通常不这么做:

    int main(int argc,char const *argv[])

    好,下一步直接把这一坨往开头一方,完事:

    if(IsUserAdmin()){
            //is UAC
            //什么都不做 
        }
        else{
            //not UAC
            char path[100];
            GetModuleFileName(NULL,path,100);
        
            SHELLEXECUTEINFO execinfo;  
            memset(&execinfo,0,sizeof(execinfo));  
            execinfo.lpFile         =path;  
            execinfo.cbSize         =sizeof(execinfo);  
            execinfo.lpVerb         ="runas";  
            execinfo.fMask          =SEE_MASK_NO_CONSOLE;  
            execinfo.nShow          =SW_SHOWDEFAULT;  
            //execinfo.lpParameters   =NULL;  
      
            ShellExecuteEx(&execinfo);
            CloseHandle(execinfo.hProcess);
            
            exit(0);
        }

    事了拂衣去,深藏功与名~

    【欢迎加入我的qq群:789209269

  • 相关阅读:
    centos 6.8 配置 Redis3.2.5
    php将字符串转为二进制数据串
    php密码对称encrypt加密
    mysql 新建用户并赋予远程访问权限
    centos6.8 搭建postfix/dovecot邮件服务器
    centos 6.8 设置svn钩子同步至web目录
    百分百解决Job for network.service failed. See 'system的问题
    java锁机制详解
    解决网页打不开简书的问题
    SpringBoot读取不到application.yml
  • 原文地址:https://www.cnblogs.com/pta00/p/13602349.html
Copyright © 2011-2022 走看看