OpenProcessToken令牌函数使用方法

OpenProcessToken令牌函数使用方法转载自:https://www.cnblogs.com/mengfanrong/p/5185850.html GetCurrentProcessID得到当前进程的IDOpenProcessToken得到进程的令牌句柄LookupPrivilegeValue查询进程的权限AdjustTokenPrivileges调整令牌权限要对一个随意进程(包括系统安全进程和服务进程)进行指定…

大家好,又见面了,我是你们的朋友全栈君。

转载自:https://www.cnblogs.com/mengfanrong/p/5185850.html

 

GetCurrentProcessID 得到当前进程的ID OpenProcessToken得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限AdjustTokenPrivileges 调整令牌权限

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

BOOL OpenProcessToken(
HANDLE ProcessHandle,
DWORD DesiredAccess,
PHANDLE TokenHandle
);
第一參数是要改动訪问权限的进程句柄。第三个參数就是返回的訪问令牌指针;第二个參数指定你要进行的操作类型。如要改动令牌我们要指定第二个參数为TOKEN_ADJUST_PRIVILEGES(其他一些參数可參考PlatformSDK)。通过这个函数我们就能够得到当前进程的訪问令牌的句柄(指定函数的第一个參数为GetCurrentProcess()就能够了)。接着我们能够调用AdjustTokenPrivileges对这个訪问令牌进行改动。AdjustTokenPrivileges的原型例如以下:
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // 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就是指locallyuniqueidentifier,我想GUID大家是比較熟悉的,和GUID的要求保证全局唯一不同,LUID仅仅要保证局部唯一,就是指在系统的每一次执行期间保证是唯一的就能够了。另外和GUID同样的一点。LUID也是一个64位的值,相信大家都看过GUID那一大串的值。我们要怎么样才干知道一个权限相应的LUID值是多少呢?这就要用到另外一个API函数LookupPrivilegevalue。其原形例如以下: BOOL LookupPrivilegevalue( LPCTSTR lpSystemName, // system name LPCTSTR lpName, // privilege name PLUID lpLuid // locally unique identifier ); 第一个參数是系统的名称。假设是本地系统仅仅要指明为NULL就能够了,第三个參数就是返回LUID的指针。第二个參数就是指明了权限的名称,如“SeDebugPrivilege”。

在Winnt.h中还定义了一些权限名称的宏,如: #define SE_BACKUP_NAME TEXT(“SeBackupPrivilege”) #define SE_RESTORE_NAME TEXT(“SeRestorePrivilege”) #define SE_SHUTDOWN_NAME TEXT(“SeShutdownPrivilege”) #define SE_DEBUG_NAME TEXT(“SeDebugPrivilege”) 这样通过这三个函数的调用。我们就能够用OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID)来打获得随意进程的句柄。而且指定了全部的訪问权。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152920.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月25日 下午1:46
下一篇 2022年6月25日 下午1:46


相关推荐

  • charles激活成功教程方式

    charles激活成功教程方式charles 激活成功教程方式

    2026年3月19日
    2
  • keil5 debug调试_java怎么远程调试

    keil5 debug调试_java怎么远程调试文章目录前言一、进入调试二、介绍调试工具栏二、搜索寻找三、特殊的窗口1.命令输出窗口2.寄存器窗口3.汇编语言窗口4.变量查看窗口5.检测自己想要看的总结前言其实我经常用的调试方法是在指定行加Printf();通过串口查看打印的信息,就知道执行到哪一步。但是这是很麻烦的。程序由上而下的执行顺序不会变的。debug调试也是从主函数开始这样调试的。一步一步的运行调试程序检查错误,或者直接运行到某处,二话不多说,开整!一、进入调试二、介绍调试工具栏1.复位按钮:(类似于用复位按键..

    2022年10月15日
    3
  • java 生成二维码

    java 生成二维码最近在做一个自提的需求 当用户下单后给该笔订单生成一个二维码 当用户去实体店自提的时候 实体店扫用户提供的二维码 这样该笔订单就算完成了 1 相关的依赖 dependency groupId com google zxing groupId artifactId javase artifactId version 3 3 0 amp l version dependency

    2026年3月17日
    2
  • aliddns ipv6_AliDDNS v2.0.0.1 – 阿里云DNS动态解析Windows客户端 支持IPv6 微信推送「建议收藏」

    aliddns ipv6_AliDDNS v2.0.0.1 – 阿里云DNS动态解析Windows客户端 支持IPv6 微信推送「建议收藏」AliDDNS使用帮助欢迎使用AliDDNS——阿里云解析DNS动态IP自动更新程序。AliDDNS通过使用阿里云API来完成DNS记录获取以及更新。AliDDNS会自动作为Windows服务在后台持续监测并更新IP地址。AliDDNS还同时支持IPv4以及IPv6,在IPv6即将普及的情况下,AliDDNS已经开启了对其的支持。AliDDNS无需安装,点击即可使用。以下为使用说明介绍:第…

    2022年6月7日
    82
  • 架设ftp服务器从入门到精通[通俗易懂]

    架设ftp服务器从入门到精通[通俗易懂]1.FTP是什么FTP的全称是FileTransferProtocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。FTP服务器则是在互联网上提供存储空间的计算机,它们依照FTP协议提供服务。当它们运行时,用户就可以连接到服务器上下载文件,也可以将自己的文件上传到FTP服务器中。有时把FTP服务器简称为FTP。FTP服务器的存在,大大方便了网友之间远程交换文件资料的需要,充分体现了互联网资源共享的精神。现在许多朋友都已经用上了宽带网,而且硬盘也有足够的空间,完全可以通过软件手段把自己的

    2022年7月21日
    23
  • mysql数据库创建表_eclipse怎么导入jdbc驱动

    mysql数据库创建表_eclipse怎么导入jdbc驱动承接上一篇,MySQL我们已经安装OK了,那么怎么可以不去玩玩它呢!!学习重点:一:CMD登入退出命令:二:MySQL数据库服务器、数据库和表的关系三:数据库的指令操作四:表的常用指令操作

    2022年8月2日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号