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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DeepLink的实现原理「建议收藏」

    DeepLink的实现原理「建议收藏」前言之前我们又是看源码又是研究动画,今天分享一个比较简单的技术点:DeepLink。DeepLink,深度链接技术,主要应用场景是通过Web页面直接调用Android原生app,并且把需要的参数通过Uri的形式,直接传递给app,节省用户的注册成本。简单的介绍DeepLink概念之后,我们看一个实际的例子:朋友通过京东分享给我一个购物链接:于是我通过微信打开了这条链接:…

    2022年6月23日
    65
  • 数据库连接泄露的问题有哪些_数据库自身的安全风险

    数据库连接泄露的问题有哪些_数据库自身的安全风险对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇。如果存在数据连接泄漏问题,应用程序将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的崩溃。数据连接泄漏像黑洞一样让开发者避之唯恐不及。SpringDAO对所有支持的数据访问技术框架都使用模板化技术进行了薄层的封装。只要您的程序都使用SpringDAO模板(如JdbcTemplate、HibernateTemplate等)进行

    2025年12月9日
    3
  • 虚函数后面的分号可有可无_虚函数需要实现吗

    虚函数后面的分号可有可无_虚函数需要实现吗const 和 =0要分开理解.首先理解一下分开的意思成员函数后面用 const 修饰,const表示this是一个指向常量的指针,即对象成为一个常量,即它的成员不能够变化.(默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_data成员函数中,this的类型是Sales_data *const,即类一旦实例化一个对象后,this指向这个对象,是不能改变的,但是对象…

    2022年8月18日
    8
  • 流水线设计的方法和作用「建议收藏」

    流水线设计的方法和作用「建议收藏」流水线设计从某种程度上可以提高系统频率,因此常用于高速信号处理领域,如果某个信号可以分为若干步骤处理,而且整个数据处理过程是单项的,即没有反馈运算和迭代运算,前一个步骤的输出就是下一个步骤的输入,可以考虑流水线设计来提高系统的频率。如下图所示:典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其当她是…

    2022年4月19日
    44
  • 如何搭建安卓开发环境?(手把手教你,超详细!)

    如何搭建安卓开发环境?(手把手教你,超详细!)推荐查阅官方文档:创建Android项目|Android开发者|AndroidDevelopers(google.cn)建议看完全篇文章再动手请先确保Java环境配置成功一、

    2022年7月1日
    25
  • 索引是否覆盖例子_数据库索引的概念及作用

    索引是否覆盖例子_数据库索引的概念及作用(1)select*frommyTestwherea=3andb=5andc=4;—-abc顺序abc三个索引都在where条件里面用到了,而且都发挥了作用(2)select*frommyTestwherec=4andb=6anda=3;where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样(3)select*frommyTestwherea=3andc=7;a用到索引,b没有用,所以c是没有用到索…

    2022年10月9日
    3

发表回复

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

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