如何获得调试WinLogon进程权限

      由于这篇文章适应于Windows2000与WinNT操作系统,所以首先给出两个简易的判断当前操作系统,是否为Windows2000系统或WinNT系统的判断函数。

   BOOL IsWin2K(void){

        OSVERSIONINFO OSVersionInfo;

        OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

        if(GetVersionEx(&OSVersionInfo)){

           return ((OSVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) &&

                   (OSVersion.dwMajoVersion == 5));

        }

        else{

           return FALSE;

        }       

   }

   BOOL IsWinNT(void){

        OSVERSIONINFO OSVersionInfo;

        OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

        if(GetVersionEx(&OSVersionInfo)){

           return ((OSVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) &&

                   (OSVersion.dwMajoVersion == 5));

        }

        else{

            return FALSE;

        }

   }

    由于涉及到调试进程,就必须熟悉TOKEN_PRIVILEGES结构,这个结构中包含了一些access token的权限信息:

    typedef struct __TOKEN_PRIVILEGES{

        DWORD PrivilegeCount;

        LUID_AND_ATTRIBUTES Privileges[];

    }TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

    第一个参数是Privileges数组的个数,第二个参数是一个LUID_AND_ATTRIBUTES结构数组,显来我们知道其中包含一个LUID(Locally unique identifier)值与一个属性值。再利用OpenProcessToken函数得到当前进程的access token的句柄:

    HANDLE hToken;

    OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken);

接着我们利用LookupPrivilegesValue函数取得LUID值:

    TOKEN_PRIVILEGES TokenPrivileges;

    LookupPrivilegesValue(NULL, "SeDebugPrivilege", &TokenPrivileges[0].Luid);

第一个参数我们传递一个NULL,即为地本系统,第二个参数我们传递一个特权名SeDebugPrivilege,第三个参数是用来保存LUID的地址。最后我们调用一个AdjustTokenPrivileges函数即可大功告成,以下给出完整的C++代码:

BOOL DebugWinLogon(void)

{

    HANDLE hToken;

    TOKEN_PRIVILEGES TokenPrivileges, PreviousState;

    DWORD dwReturnLength = 0;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,

       &hToken)){

       if(LookupPrivilegesValue(NULL, "SeDebugPrivilege", &TokenPrivileges[0].Luid)){

          TokenPrivileges.PrivilegeCount = 1;

          TokenPrivileges[0].Attributes = SE_PRIVILEGE_ENABLED;

          return (AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof

                 (TOKEN_PRIVILEGES), &PreviousState, &dwReturnLength));

       }

    }

    return FALSE;

}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

qiwei

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值