精华内容
下载资源
问答
  • Windows提升进程权限

    千次阅读 2015-01-03 15:00:47
    Windows提升进程权限 文章一: 在枚举/结束系统进程或操作系统服务时,会出现权限不足而失败的情况,这时就需要提升自己进程到系统权限,其实提升权限的代码很简单的,看过的最经典的应该是《WINDOWS核心编程》第...

    Windows提升进程权限

    文章一:

    在枚举/结束系统进程或操作系统服务时,会出现权限不足而失败的情况,这时就需要提升自己进程到系统权限,其实提升权限的代码很简单的,看过的最经典的应该是《WINDOWS核心编程》第四章中操作进程给出的那个函数,如果我们真的不了解它的操作也不要紧,因为只要在你需要的地方调用下面这个函数就是了,以下是它的代码:

     BOOL EnablePriv()

    {

    HANDLEhToken;

    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) )

    {

          TOKEN_PRIVILEGES tkp;

          LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限

          tkp.PrivilegeCount=1;

          tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

          AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

          return( (GetLastError()==ERROR_SUCCESS) );

    }

          return TRUE;

    }

     文章二:

    GetCurrentProcessID:得到当前进程的ID

    OpenProcessToken:得到进程的令牌句柄

    LookupPrivilegeValue:查询进程的权限

    AdjustTokenPrivileges:判断令牌权限

    要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被使能(Enabled)的,所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下:

    BOOL OpenProcessToken( HANDLEProcessHandle,  DWORD DesiredAccess,  PHANDLE TokenHandle )

    第一参数是要修改访问权限的进程句柄;第三个参数就是返回的访问令牌指针;第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考Platform SDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。AdjustTokenPrivileges的原型如下:

    BOOLAdjustTokenPrivileges( 

    HANDLE TokenHandle, //handle to token 

    BOOLDisableAllPrivileges, // disabling option

    PTOKEN_PRIVILEGESNewState, // privilege information

    DWORD BufferLength, //size of buffer 

    PTOKEN_PRIVILEGESPreviousState, // original state buffer 

    PDWORD ReturnLength //required buffer size ); 

    第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作;第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL;第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空;最后一个参数为实际PreviousState结构返回的大小。在使用这个函数前再看一下TOKEN_PRIVILEGES这个结构,其声明如下:

    typedef struct_TOKEN_PRIVILEGES { 

    DWORD PrivilegeCount; 

    LUID_AND_ATTRIBUTES Privileges[]; 

    } TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES; 

    PrivilegeCount指的数组原素的个数,接着是一个LUID_AND_ATTRIBUTES类型的数组,再来看一下LUID_AND_ATTRIBUTES这个结构的内容,声明如下:

    typedef struct_LUID_AND_ATTRIBUTES { 

    LUID Luid; 

    DWORD Attributes; 

    } LUID_AND_ATTRIBUTES,*PLUID_AND_ATTRIBUTES 

    第二个参数就指明了我们要进行的操作类型,有三个可选项: SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、SE_PRIVILEGE_USED_FOR_ACCESS。要使能一个权限就指定Attributes为SE_PRIVILEGE_ENABLED。第一个参数就是指权限的类型,是一个LUID的值,LUID就是指locally unique identifier,我想GUID大家是比较熟悉的,和GUID的要求保证全局唯一不同,LUID只要保证局部唯一,就是指在系统的每一次运行期间保证是唯一的就可以了。另外和GUID相同的一点,LUID也是一个64位的值,相信大家都看过GUID那一大串的值,我们要怎么样才能知道一个权限对应的LUID值是多少呢?这就要用到另外一个API函数LookupPrivilegevalue,其原形如下:

    BOOLLookupPrivilegevalue( 

    LPCTSTR lpSystemName, //system name 

    LPCTSTR lpName, //privilege name

    PLUID lpLuid // locallyunique identifier );

    第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,如“SeDebugPrivilege”。在Winnt.h中还定义了一些权限名称的宏,如:

    #define SE_BACKUP_NAMETEXT("SeBackupPrivilege") 

    #define SE_RESTORE_NAMETEXT("SeRestorePrivilege") 

    #define SE_SHUTDOWN_NAMETEXT("SeShutdownPrivilege") 

    #define SE_DEBUG_NAMETEXT("SeDebugPrivilege") 

    这样通过这三个函数的调用,我们就可以用OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID)来打获得任意进程的句柄,并且指定了所有的访问权。

    定时关机程序代码:

    voidCClosepcDlg::OnTimer(UINT nIDEvent) 

    {

    // TODO: Add your messagehandler code here and/or call default

    CTimet=CTime::GetCurrentTime();

    int h=t.GetHour ();

    int min=t.GetMinute ();

    CString hh,mins;

    hh.Format("%d",h);

    mins.Format("%d",min);

    CStringstr=t.Format("%H:%M:%S");

    GetDlgItem(IDC_SHOW)->SetWindowText(str);

    /准备关机//

    if(start &&close_hour.CompareNoCase(hh)==0 && close_min.CompareNoCase(mins)==0)

    {

      KillTimer(1);

       /首先声明3个全局变量///BOOLfResult;TOKEN_PRIVILEGES tkp;HANDLE hToken;

           if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |TOKEN_QUERY, &hToken)) //得到进程的令牌句柄;

       {

         MessageBox("OpenProcessToken failed!");

       }

        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); //获得本地机唯一的标识,查询权限

         tkp.PrivilegeCount= 1; 

        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

           AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);//调整获得的权限

        

        if (GetLastError() != ERROR_SUCCESS) 

       {

               MessageBox("AdjustTokenPrivileges enable failed!");

       }

        fResult =InitiateSystemShutdown( 

                NULL,                                 // 要关的计算机用户名

                "你设置的自动关机时间以到,请保存好你的文件,系统马上就要关闭!", // 显示的消息

                20,                                   // 关机所需的时间

                TRUE,                                // ask user to close apps 

        //       TRUE);                              //设为TRUE为重起,设为FALSE为关机

       FALSE);

        if(!fResult) 

       { 

                MessageBox("InitiateSystemShutdown failed."); 

       }

        tkp.Privileges[0].Attributes = 0; 

           AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);

        if (GetLastError() != ERROR_SUCCESS) 

       {

                MessageBox("AdjustTokenPrivileges disable failed."); 

       }

        ExitWindowsEx(EWX_SHUTDOWN,0);

    }

    CDialog::OnTimer(nIDEvent);

    }

    voidCClosepcDlg::OnStar() 

    {

    // TODO: Add your controlnotification handler code here

    start=true;

    ShowWindow(SW_HIDE);

    //定义系统托盘//

    m_nid.cbSize=sizeof(NOTIFYICONDATA);//设置结构大小

    m_nid.hWnd=this->m_hWnd ;//设置图标对应的窗口

    m_nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;//图标属性

    m_nid.uCallbackMessage=MYWM_NOTIFYICON;//应用程序定义的回调消息ID

    设置NOTIFYICONDATA结构///

    CString szToolTip;

    szToolTip=_T("自动关机程序");

    _tcscpy(m_nid.szTip,szToolTip);//帮助信息

    m_nid.uID=IDR_MAINFRAME;//应用程序图标

    HICON hIcon;

    hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    m_nid.hIcon =hIcon;//图标句柄

    // PNOTIFYICONDATAm_pnid=&m_nid;

    ::Shell_NotifyIcon(NIM_ADD,&m_nid);//增加图标到系统盘

    if(hIcon)

      ::DestroyIcon (hIcon);

     

    }

    LRESULTCClosepcDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 

    {

    switch(message)

    {

    case MYWM_NOTIFYICON:

      if(lParam==WM_LBUTTONDBLCLK)

       {

       AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);

       }

       elseif(lParam==WM_RBUTTONDOWN)

       {

        CMenumenu;

       menu.LoadMenu(IDR_MENU1);

        CMenu*pMenu=menu.GetSubMenu(0);

        CPointpos;

       GetCursorPos(&pos);

       pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());

       }

       break;

    case WM_SYSCOMMAND:

      if(wParam==SC_MINIMIZE)

       {

       //定义系统托盘//

       m_nid.cbSize =sizeof(NOTIFYICONDATA);//设置结构大小

       m_nid.hWnd =this->m_hWnd ;//设置图标对应的窗口

       m_nid.uFlags =NIF_MESSAGE|NIF_ICON|NIF_TIP;//图标属性

        m_nid.uCallbackMessage=MYWM_NOTIFYICON;//应用程序定义的回调消息ID

       设置NOTIFYICONDATA结构///

       CString szToolTip;

       szToolTip=_T("自动关机程序");

       _tcscpy(m_nid.szTip ,szToolTip);//帮助信息

       m_nid.uID =IDR_MAINFRAME;//应用程序图标

        HICONhIcon;

        hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

       m_nid.hIcon =hIcon;//图标句柄

    //   PNOTIFYICONDATA m_pnid=&m_nid;

       ::Shell_NotifyIcon (NIM_ADD,&m_nid);//增加图标到系统盘

       if(hIcon)

        ::DestroyIcon (hIcon);

       AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);

        return0;

       }

       break;

    }

    returnCDialog::WindowProc(message, wParam, lParam);

    }

    voidCClosepcDlg::OnQuit() 

    {

    // TODO: Add your commandhandler code here

    PostQuitMessage(0);

    }

    voidCClosepcDlg::OnShow() 

    {

    // TODO: Add your commandhandler code here

    ShowWindow(1);

    ::Shell_NotifyIcon(NIM_DELETE,&m_nid);

     

    }

    voidCClosepcDlg::OnStop() 

    {

    // TODO: Add your commandhandler code here

    start=false;

    ShowWindow(1);

    ::Shell_NotifyIcon(NIM_DELETE,&m_nid);

     

    }

    voidCClosepcDlg::OnSelchangeHour() 

    {

    m_hour.GetWindowText(close_hour);

    }

    voidCClosepcDlg::OnSelchangeMin() 

    {

    m_min.GetWindowText(close_min);

    }

     文章三:

    windows的每个用户登录系统后,系统会产生一个访问令牌(access token) ,其中关联了当前用户的权限信息,用户登录后创建的每一个进程都含有用户access token的拷贝,当进程试图执行某些需要特殊权限的操作或是访问受保护的内核对象时,系统会检查其acess token中的权限信息以决定是否授权操作。Administrator组成员的access token中会含有一些可以执行系统级操作的特权(privileges) ,如终止任意进程、关闭/重启系统、加载设备驱动和更改系统时间等,不过这些特权默认是被禁用的,当Administrator组成员创建的进程中包含一些需要特权的操作时,进程必须首先打开这些禁用的特权以提升自己的权限,否则系统将拒绝进程的操作。注意,非Administrator组成员创建的进程无法提升自身的权限,因此下面提到的进程均指Administrator组成员创建的进程。

    Windows以字符串的形式表示系统特权,如“SeCreatePagefilePrivilege”表示该特权用于创建页面文件,“SeDebugPrivilege”表示该特权可用于调试及更改其它进程的内存,为了便于在代码中引用这些字符串,微软在winnt.h中定义了一组宏,如 #define SE_DEBUG_NAMETEXT("SeDebugPrivilege")。完整的特权列表可以查阅msdn的security一章。虽然Windows使用字符串表示特权,但查询或更改特权的API需要LUID来引用相应的特权,LUID表示local unique identifier,它是一个64位值,在当前系统中是唯一的。为了提升进程权限到指定的特权,我们必须先找到该特权对应的LUID,这时要调用LookupPrivilegeValue函数。

    获得特权对应的LUID之后,我们要打开该特权。此时要用到LUID_AND_ATTRIBUTES结构,其定义如下:

    typedef struct_LUID_AND_ATTRIBUTES {

        LUID Luid;

        DWORD Attributes;

    } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;

    Attributes取SE_PRIVILEGE_ENABLED时将打开Luid对应的特权。设置完成后,我们需要调用AdjustTokenPrivileges函数通知操作系统将指定的access token权限中的特权置为打开状态,前面我们说过,进程执行需要特列权限的操作时系统将检查其access token,因此更改了进程的access token特权设置,也就是更改了所属进程的特权设置。AdjustTokenPrivileges函数的原型如下:

    BOOL WINAPIAdjustTokenPrivileges(

      __in         HANDLE TokenHandle,

      __in         BOOL DisableAllPrivileges,

      __in_opt     PTOKEN_PRIVILEGES NewState,

      __in         DWORD BufferLength,

      __out_opt    PTOKEN_PRIVILEGES PreviousState,

      __out_opt    PDWORD ReturnLength

    );

    TokenHandle是要更改特权设置的acess token的句柄,DisableAllPrivileges表示是否禁用该access token的所有特权,NewState用来传递要新的特权设置,注意它的类型是PTOKEN_PRIVILEGES,PTOKEN_PRIVILEGES是TOKEN_PRIVILEGES结构的指针,定义如下:

    typedef struct_TOKEN_PRIVILEGES {

        DWORD PrivilegeCount;

        LUID_AND_ATTRIBUTESPrivileges[ANYSIZE_ARRAY];

    } TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES;

    其中ANYSIZE_ARRAY被定义为1,可以看到TOKEN_PRIVILEGES中包含了用于设置特权信息的LUID_AND_ATTRIBUTES结构,在使用时,只需要将PrivilegeCount赋为1,然后把Privileges数组的第1个元素(Privileges[0])的Luid域设置为指定特权的Luid,再将其Attributes域设置为SE_PRIVILEGE_ENABLED,就可以完成TokenHandle表示的access token权限的提升了。

    下面是一个实际的例子,用来将执行promoteProcessPrivilege的当前进程的指定特权打开,函数参数为指定的特权名,可以传递其宏定义,也可以是完整的字符串表示:

    BOOLpromoteProcessPrivileges(const TCHAR* newPrivileges)

    {

           HANDLE tokenHandle;

           //获得当前进程的access token句柄

           if(::OpenProcessToken(::GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES, &tokenHandle) == FALSE)

                  return FALSE;

           TOKEN_PRIVILEGES structTkp;

           //查找newPrivileges参数对应的Luid,并将结果写入structTkp.Privileges[0]Luid域中

           if(::LookupPrivilegeValue(NULL, newPrivileges,&structTkp.Privileges[0].Luid) == FALSE){

                  CloseHandle(tokenHandle);

                  return FASLE;

           }

           //设置structTkp结构

           structTkp.PrivilegeCount = 1;

           structTkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

           //通知操作系统更改权限

           if(::AdjustTokenPrivileges(tokenHandle, FALSE, &structTkp,sizeof(structTkp), NULL, NULL) == FALSE){

                  CloseHandle(tokenHandle);

                  return FALSE;

           }

           CloseHandle(tokenHandle);   

           return TRUE;

    }

    我们来用一个简单的例子验证promoteProcessPrivileges函数。下面的traceSystemProcess用于遍历当前系统进程,如果调用traceSystemProcess函数的进程以默认权限运行,对于如csrss.exe之类的进程,函数将没有足够的权限获得其模块名。如果在traceSystemProcess之前调用了promoteProcessPrivileges将进程权限提升至SE_DEBUG_NAME级别,traceSystemProcess函数将能正确打印出如csrss.exe等关键进程的路径:

    BOOL traceSystemProcess()

    {

           PROCESSENTRY32 processEntry;

           processEntry.dwSize = sizeof(processEntry);

     

           HANDLE hProcessSnap =::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

           if(hProcessSnap == INVALID_HANDLE_VALUE){

                  _tprintf(_T("CreateToolhelp32Snapshot 调用失败!/n"));

                  return FALSE;

           }    

     

           BOOL bMore = ::Process32First(hProcessSnap,&processEntry);

           while(bMore){

                  _tprintf(_T("进程名称:%s /n"), processEntry.szExeFile);

                  _tprintf(_T("进程ID号:%u /n"), processEntry.th32ProcessID);

                  HANDLE hProcess =::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,

                                                        FALSE,processEntry.th32ProcessID);

                  if(hProcess != NULL){

                         TCHAR szBuffer[MAX_PATH] = {_T('/0')};

                         if(::GetModuleFileNameEx(hProcess, NULL,szBuffer, MAX_PATH)){

                                _tprintf(_T("进程路径:%s /n"), szBuffer);

                         }

                         ::CloseHandle(hProcess);

                  }

                  _tprintf(_T("/n"));

                  bMore =::Process32Next(hProcessSnap,&processEntry);

           }

           ::CloseHandle(hProcessSnap);

           return TRUE;

    }

    测试结果不再列出,有兴趣的朋友可以自己试一试。

     

    首先列出需要的函数

    1.OpenProcessToken

    2.AdjustTokenPrivileges

    3. LookupPrivilegeValue

    首先需要获取进程的令牌句柄

    OpenProcessToken的原型.

    BOOL WINAPIOpenProcessToken(

     __in         HANDLE ProcessHandle,

     __in         DWORD DesiredAccess,

     __out         PHANDLE TokenHandle

    );

    第一个参数:进程句柄(当前进程为GetCurrentProcess()为参数);

    第二个参数:访问令牌特权;

    第三个参数:返回的参数,就是AdjustTokenPrivileges的第一个参数。

     例子:

    HANDLE hToken;

    bool retn =OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);

    if(!retn)

    {

         return; //获取令牌失败。。

    }

    注:第二个参数是令牌的权限,这个权限是要有修改权限的特权,意思就是要把你程序的权限修改得更高。

    关于其他权限可以查MSDN。所有权限可以写TOKEN_ALL_ACCESS ,去查看一个令牌特权可以用TOKEN_QUERY这个下面函数有写。

    首先先说一下使用AdjustTokenPrivileges需要的。

    在这个函数中的第3和第5个参数中需要用到一个TOKEN_PRIVILEGES的结构体,在这个结构体中还有个LUID_AND_ATTRIBUTES结构体(详细说明 查看我博客的翻译分类里)

    TOKEN_PRIVILEGES结构体

    typedef struct_TOKEN_PRIVILEGES

    {

          DWORD PrivilegeCount; 

          LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];

    }TOKEN_PRIVILEGES;   

    下面的参数是个特权数组。

    面的参数是要修改的特权数目:

    LUID_AND_ATTRIBUTES 结构体

    typedef struct_LUID_AND_ATTRIBUTES 

    {  

          LUID Luid;  

          DWORD Attributes;

    } LUID_AND_ATTRIBUTES;

    第一个参数是Luid是一个标志,不同的Luid代表着各种不同的特权类型;

    第二个参数是要这个特权干嘛,如启用这个特权(SE_PRIVILEGE_ENABLED)

    这里的Luid的值需要用LookupPrivilegeValue来获取。

    LookupPrivilegeValue的原型

    BOOL WINAPILookupPrivilegeValue(

     __in_opt      LPCTSTR lpSystemName,

     __in          LPCTSTR lpName,

     __out         PLUID lpLuid

    );

    第一个参数是系统的名字,如果为NULL,就是本地名字(这里就填NULL)

    第二个参数是特权的名字,要查看详细特权,看我的博客里翻译分类里的 包含特权 的文章。(在这里写SE_DEBUG_NAME)

    第三个参数就可以通过指针返回一个LUID类型的Luid的标识了。 通过这个值就可以填入刚才的结构体里了。

    最后就可以介绍AdjustTokenPrivilege就应该没什么问题了。

    它的原型为:

    BOOL WINAPIAdjustTokenPrivileges(

     __in          HANDLE TokenHandle,

     __in         BOOL DisableAllPrivileges,

     __in_opt      PTOKEN_PRIVILEGES NewState,

     __in         DWORD BufferLength,

     __out_opt     PTOKEN_PRIVILEGES PreviousState,

     __out_opt     PDWORD ReturnLength

    );

    第一个参数为OpenProcessToken第三个指针参数传出的句柄值;

    第二个参数为是否禁用所有所有的特权(这里填false);

    第三个参数为新的TOKEN_PRIVILEGES的特权结构体指针;

    第四个参数是上面结构体的字节长度(sizeof);

    第五个参数是 接受原先的特权的结构体;

    第六个参数也是这个结构体的字节长度的指针。

    在这里后两个参数不用管。

    详细看我的博客翻客相关说明

    MSDN里说:如果第五个参数不是NULL,在OpenProcessToken加特权时除了需要指定TOKEN_ADJUST_PRIVILEGES还必须指定TOKEN_QUERY

    如果第五个参数是NULL,你不接受原先的结构体(第六个当然也是NULL), 就不用再指定附加的TOKEN_QUERY的特权了。

    还要注意:

     就算这个函数返回为真,还要调用GetLastError()来检验是否完全成功。

    如果返回ERROR_SUCCESS就代表修改非常成功 。。。其他的返回值 查我博客。

    这个非常重要!!

    还有就是Vista和Window7 里 一定要开管理员模式才能获取成功。

    完整的例子,可以直接复制到VC 6.0里。

    #include<windows.h>

    #include <iostream>

    using namespace std;

    void main()

    {

            BOOL retn;

            HANDLE hToken;

            retn =OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);

            if(retn != TRUE)

            {

                        cout<<"获取令牌句柄失败!"<<endl;

                        return;

            }

     

            TOKEN_PRIVILEGES tp; //新特权结构体

            LUID Luid;

            retn =LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid);

     

            if(retn != TRUE)

            {

                        cout<<"获取Luid失败"<<endl;

                        return;

            }

                    //TPTP里的LUID结构体赋值

            tp.PrivilegeCount = 1;

            tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;

            tp.Privileges[0].Luid = Luid;

       

           AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

            if(GetLastError() != ERROR_SUCCESS)

            {

                        cout<<"修改特权不完全或失败!"<<endl;

            }

           else

           {

                        cout<<"修改成功!"<<endl;

           }

    }

     

    展开全文
  • windows程序提升权限

    1.要求以管理员身份运行

        在vs工程属性中,Linker ---> Manifest File---> UAC Execution Level,选择requireAdministrator (/level='requireAdministrator')选项


    2.在main函数开始时运行以下函数代码:

    BOOL WINAPI EnablePrivileges()
    {
    	HANDLE hToken;
    	TOKEN_PRIVILEGES tkp;
    
    	if (!OpenProcessToken(GetCurrentProcess(),
    		TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    		return(FALSE);
    
    	LookupPrivilegeValue(NULL, SE_DEBUG_NAME,
    		&tkp.Privileges[0].Luid);
    
    	tkp.PrivilegeCount = 1;
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
    		(PTOKEN_PRIVILEGES)NULL, 0);
    
    	if (GetLastError() != ERROR_SUCCESS)
    		return FALSE;
    
    	return TRUE;
    }

    转至:http://blog.csdn.net/tobacco5648/article/details/26454851
    展开全文
  • windows 权限提升

    千次阅读 2018-06-09 01:27:07
    url:https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx
    url:https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx
    展开全文
  • windows提升进程权限
    在windows里提升进程权限
    
    展开全文
  •   在Windows命令行下执行命令时,有些...仿照Linux,在Windows普通命令行下直接提升权限。 1. 使用C++制作一个sudo命令   提升程序本身权限,传递命令行参数,调用system()执行命令。程序代码如下: /* sudo ...
  • Windows 本地权限提升漏洞 CVE-2021-1732 EXP 下载
  • windows 10 提升管理员权限

    万次阅读 热门讨论 2018-04-21 16:26:53
    在我们编写代码的过程中,部分程序的运行就需要提升管理员权限才可以。下面我来说一下将本用户提升管理员权限的方式,而不是增加一个管理员用户。环境:1)本方法仅适用专业版、教育版、企业版。不适合家庭版。步骤...
  • msf反弹了shell后,可以尝试输入getsystem尝试提升权限 getsystem 如这里直接提升为systmen权限 假设这里通过这种方式没有提升权限,则接下来使用别的方法来进行权限提升 一. 提高程序运行级别 将会话放入...
  • 后渗透—— Windows系统权限提升

    千次阅读 2020-03-10 20:39:05
    有时候,通过某些方式(如上传Webshell)获取执行命令的shell,但是会因为权限限制而无法执行某些命令。这时候为了“扩大战果”就需要利用提权,来让原本的低权限(如只允许列目录)–>高权限(拥有修改文件的...
  • windows提升进程权限

    千次阅读 2009-10-16 22:38:00
    windows的每个用户登录系统后,系统会产生一个访问令牌(access token),其中关联了当前用户的权限信息,用户登录后创建的每一个进程都含有用户access token的拷贝,当进程试图执行某些需要特殊权限的操作或是访问...
  • windows提升进程权限 LUID

    千次阅读 2012-06-14 15:04:01
    windows的每个用户登录系统后,系统会产生一个访问令牌(access token),其中关联了当前用户的权限信息,用户登录后创建的每一个进程都含有用户access token的拷贝,当进程试图执行某些需要特殊权限的操作或是访问...
  • Windows提升程序运行权限

    千次阅读 2013-10-10 09:44:56
    Windows提升程序运行权限  程序运行权限问题一直是令我很头疼的问题,随着Windows版本越来越高,对权限的控制也越来越严格。把以前解决权限的方式总结一下:  1.将你要运行程序的名字改为:Setup.exe(大小写...
  • windows cmd脚本提升管理员权限

    千次阅读 2020-06-09 18:26:48
    在开启UAC权限管理时,运行脚本默认是没有管理员权限的。因此导致在脚本中执行某些程序时会权限不足。 ... 已管理员权限运行有两种方式: 方式一:右键菜单,选择以管理员...方式二:调用VB对象提升脚本权限 if "%~.
  • 由于做的程序需要访问由服务程序创建的共享内存, 这时应用程序权限低,服务程序权限高, 应用程序访问服务程序时出现关于权限的错误。 可以通过 SECURITY_ATTRIBUTES lpSA;ZeroMemory(&lpSA, sizeof(SECURITY_...
  • C# 程序在 Windows 7 中自我提升权限

    千次阅读 2012-04-11 16:55:07
    C# 程序在 Windows 7 中自我提升权限 Introduction User Account Control (UAC) is a new security component inWindows Vista and newer operating systems. With UAC fully enabled,interactive ...
  • windows默认文件夹权限(提升权限用)

    千次阅读 2005-02-15 22:02:00
    这些文件夹权限给列出来了,你上传asp木马之后,用来提供权限用的。这里主要是给你列个表。好查呀,收藏吧,很有用的。文件或文件夹 用户组 建议权限 继承方式 %AllUsersProfile% 包含了每个用户的桌面以及配置文件...
  • 受影响系统:Microsoft Windows XP SP2Microsoft Windows Vista SP1Microsoft Windows Vista Microsoft Windows Server 2008Microsoft Windows Server 2003 SP2Microsoft Windows Server 2003 SP1描述:Windows是...
  • 渗透测试笔记:Windows权限提升

    千次阅读 2016-09-22 00:58:47
    尽管尝试了这么多种提权组合,数据库的存储过程都用尽了,还是没能提升权限,不免使我感觉非常沮丧。 就这么算了吧。 即使我通过cmd上传了一段木马程序并执行,这也很难躲过服务器上360的那双眼,...
  • Summary] The privilege problem of registry key value and the method how to promote privilege in Windows 7   在我们解决Windows系统问题或者对...但是如果注册表键值是被其他软件更改的,往往也会将权限一起更改
  • 微软官方于8月12日发布安全更新,其中修复了一个修复了NetLogon权限提升漏洞(CVE-2020-1472),攻击者通过NetLogon(MS-NRPC),建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限。成功利用此漏洞...
  • Microsoft Windows键盘事件权限提升漏洞

    千次阅读 2007-06-27 14:30:00
    Microsoft Windows键盘事件权限提升漏洞发布日期:2005-09-07更新日期:2005-09-07受影响系统: Microsoft Windows XP SP2Microsoft Windows XP SP1Microsoft Windows XPMicrosoft Windows Server 2003 SP1Microsoft...
  • Windows 权限管理

    千次阅读 2017-09-14 11:03:08
    用户与权限windows vista之前,用户登录,就会创建一个安全令牌(security token),当代码试图访问受保护的安全资源时,os会出示这个安全令牌。从包括windows资源管理器在内的第一个进程开始,这个令牌会与新建的...
  • Windows系统权限

    千次阅读 2019-01-12 16:47:36
    无形的栅栏 完全解析Windows系统权限(1) 一. 权限的由来 远方的某个山脚下,有一片被森林包围的草原,草原边上居住着一群以牧羊为生的牧民。草原边缘的森林里,生存着各种动物,包括野狼。 由于羊群是牧民...
  • 权限提升之——windows提权

    千次阅读 2020-05-02 22:27:24
    提权就是通过各种办法和漏洞,提高自己在服务器中的权限,以便控制全局。 Windows:User >> System Linux:User >> Root 一、常见提权方法 1、溢出漏洞提权 2、数据库提权 3、第三方软件提权 二、Cmd...
  • //文章不错,我看了后觉得对于系统管理员来讲能够更好的防范这种渗透攻击,提升系统安全性能转自http://blog.hackbase.com/cat提升权限终极技巧作者:黑狼个人总结如下:1: C:/Documents and Settings/All Users/...
  • Windows权限

    千次阅读 2012-06-15 18:39:44
    什么是system权限?为什么说它是最高的权限? 请大家认真看完本贴。 一. 权限的由来  远方的某个山脚下,有一片被森林包围的草原,草原边上居住着一群以牧羊为生的牧民。草原边缘的森林里,生存着各种动物,...
  • windows权限控制

    2014-09-10 08:17:19
    windows权限控制是针对“资源”
  • 在Twitter看到的,转载出来分享一下 powershell -ep bypass "Install-Module -Name NtObjectManager;start-Win32ChildProcess cmd

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,522
精华内容 21,008
关键字:

windows怎么提升权限