如何获得调试WinLogon进程权限

原创 2002年01月05日 18:21:00

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

}

system权限实现屏幕截屏

首先必须了解几个重要的概念: 窗口站(WindowsStation)和桌面(Desktop)是Windows操作系统底层暴露给Windows API的执行体对象(Windows内部有两种类型的对象:...
  • kikaylee
  • kikaylee
  • 2015年03月04日 12:12
  • 1933

提升进程权限-OpenProcessToken等函数的用法

提升进程权限-OpenProcessToken等函数的用法 GetCurrentProcessID 得到当前进程的ID OpenProcessToken 得到进程的令牌句柄 LookupPrivil...
  • u011471873
  • u011471873
  • 2016年07月08日 17:41
  • 533

Windows提升进程权限

Windows提升进程权限 文章一: 在枚举/结束系统进程或操作系统服务时,会出现权限不足而失败的情况,这时就需要提升自己进程到系统权限,其实提升权限的代码很简单的,看过的最经典的应该是《WIND...
  • liubing8609
  • liubing8609
  • 2015年01月03日 15:00
  • 2400

某P保护之调戏权限清0的学习。

废话不多说啦,直接开干。 我们先来看看ValidAccessMask的值。 通过NtCreateDebugObject来定位。 uf  NtCreateDebugObject 地址为f...
  • kingswb
  • kingswb
  • 2016年06月19日 09:06
  • 626

VC程序获取管理员权限

一:编译程序的时候设置一下 在项目属性–连接器–清单文件–UAC执行级别改为requireAdministrator二:void GainAdminPrivileges(CString strApp...
  • CHIHUN_LOVE
  • CHIHUN_LOVE
  • 2016年12月30日 16:15
  • 1350

Win7 修改Winlogon.exe进程代码

首先要说的我用的方法不一定是最好的,但是可能是最简单的,并且是可恢复的一种方法,程序向winlogon.exe进程具体位置写入一个字节,屏蔽了Win+L。当然Ctrl+Alt+Del、Ctrl+Shi...
  • linfei2707
  • linfei2707
  • 2014年05月07日 16:27
  • 2100

用户权限设置和进程权限提升

使用某些Windows API的时候需要提升进程的默认权限,例如RegRestoreKey需要SE_RESTORE_NAME 和SE_BACKUP_NAME 权限。在这种情况下,我们需要使用到一组Wi...
  • kingswb
  • kingswb
  • 2016年05月29日 22:11
  • 629

判断进程是否以管理员权限运行(***)

判断进程是否以管理员权限运行,讨论管理员权限与UAC开启和关闭、登录的用户类型之间的关系...
  • chenlycly
  • chenlycly
  • 2015年05月01日 15:32
  • 9009

Linux进程权限问题

来源chengyaogen.blog.chinaunix.net 一、进程与权限 A.进程时Linux/Unix操作系统中最重要的抽象之一 B.进程是一个处于执行期的程序(目...
  • xin15200793067
  • xin15200793067
  • 2015年01月07日 10:21
  • 2326

用windbg内核模式调试用户态程序

使用内核调试会话也可以执行一些用户态调试任务,比如向位于用户态的模块设置断点。但这样做与使用用户态调试器有什么不同呢?我们就以向NTDLL.dll模块的ZwTerminateProcess函数(Stu...
  • lixiangminghate
  • lixiangminghate
  • 2016年10月18日 13:10
  • 1159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何获得调试WinLogon进程权限
举报原因:
原因补充:

(最多只允许输入30个字)