软件工程

本类阅读TOP10

·PHP4 + MYSQL + APACHE 在 WIN 系统下的安装、配置
·Linux 入门常用命令(1)
·Linux 入门常用命令(2)
·使用 DCPROMO/FORCEREMOVAL 命令强制将 Active Directory 域控制器降级
·DirectShow学习(八): CBaseRender类及相应Pin类的源代码分析
·基于ICE方式SIP信令穿透Symmetric NAT技术研究
·Windows 2003网络负载均衡的实现
·一网打尽Win十四种系统故障解决方法
·数百种 Windows 软件的免费替代品列表
·收藏---行百里半九十

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
如何获得调试WinLogon进程权限

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

      由于这篇文章适应于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;

}




相关文章

相关软件