已知进程的PID 如果判断进程所拥有的权限呢?
以前我也在到处找.后来自己解决了 今个写出来晒晒
先说下整体思路
1.获得进程PID,使用GetCurrentProcess函数
2.获得PID的访问令牌的句柄,使用OpenProcessToken函数
3.获得令牌句柄的信息,使用GetTokenInformation函数
4.获得权限列表,返回权限的信息,使用LookupPrivilegeName和LookupPrivilegeDisplayName函数
好了 下面贴源码
首先是API声明
.版本 2
.DLL命令 OpenProcess, 整数型, , "OpenProcess"
.参数 dwDesiredAccess, 整数型
.参数 bInheritHandle, 整数型
.参数 dwProcessId, 整数型
.DLL命令 OpenProcessToken, 整数型, "Advapi32.dll", "OpenProcessToken"
.参数 ProcessHandle, 整数型
.参数 DesiredAccess, 整数型
.参数 TokenHandle, 整数型, 传址
.DLL命令 GetTokenInformation, 整数型, "Advapi32.dll", "GetTokenInformation"
.参数 TokenHandle, 整数型
.参数 TokenInformationClass, 短整数型
.参数 TokenInformation, 整数型, 传址
.参数 TokenInformationLength, 整数型
.参数 ReturnLength, 整数型, 传址
.DLL命令 RtlMoveMemory, 整数型, "kernel32.dll", "RtlMoveMemory"
.参数 Dest, TOKEN_PRIVILEGES
.参数 Source, 整数型, 数组
.参数 lSize, 整数型
.DLL命令 CloseHandle, 整数型, , "CloseHandle"
.参数 hObject, 整数型
.DLL命令 LookupPrivilegeName, 整数型, "advapi32.dll", "LookupPrivilegeNameA"
.参数 lpSystemName, 文本型
.参数 lpLuid, LUID, 传址
.参数 lpName, 文本型
.参数 cbName, 整数型, 传址
.DLL命令 LookupPrivilegeDisplayName, 整数型, "advapi32.dll", "LookupPrivilegeDisplayNameA"
.参数 lpSystemName, 文本型
.参数 lpName, 文本型
.参数 lpDisplayName, 文本型
.参数 cbDisplayName, 整数型, 传址
.参数 lpLanguageID, 整数型, 传址
'继续是自定义数据类型声明
.版本 2
.数据类型 LUID
.成员 lowpart, 整数型
.成员 highpart, 整数型
.数据类型 LUID_AND_ATTRIBUTES
.成员 pLuid, LUID
.成员 Attributes, 整数型
.数据类型 TOKEN_PRIVILEGES
.成员 PrivilegeCount, 整数型
.成员 Privileges, LUID_AND_ATTRIBUTES, , "101"
.数据类型 PRIVILEGE
.成员 lValue, 整数型
.成员 sName, 文本型
.成员 sDisplay, 文本型
'再然后是常量声明
.版本 2
.常量 ANYSIZE_ARRAY, "100"
.常量 TokenPrivileges, "3"
.常量 TOKEN_QUERY, "8", , &H8
.常量 PROCESS_ALL_ACCESS, "2035711", , &H1F0FFF
'下面是核心代码
.版本 2
.子程序 GetProcressPrivileges
.参数 hProcess, 整数型
.参数 LanguageID, 整数型, 可空
.参数 数组, PRIVILEGE, 数组
.局部变量 hToken, 整数型
.局部变量 BufferSize, 整数型
.局部变量 InfoBuffer, 整数型, , "0"
.局部变量 i, 整数型
.局部变量 r, PRIVILEGE, , "0"
.局部变量 x, PRIVILEGE
.局部变量 lResult, 整数型
.局部变量 tpTokens, TOKEN_PRIVILEGES
.局部变量 s, 文本型
.如果真 (是否为空 (LanguageID))
LanguageID = 0
.如果真结束
OpenProcessToken (hProcess, #TOKEN_QUERY, hToken)
.如果真 (hToken ≠ 0)
GetTokenInformation (hToken, #TokenPrivileges, 0, 0, BufferSize)
.如果真 (BufferSize ≠ 0)
重定义数组 (InfoBuffer, 假, BufferSize - 4 - 1)
lResult = GetTokenInformation (hToken, #TokenPrivileges, InfoBuffer [1], BufferSize, BufferSize)
.如果真 (lResult = 1)
RtlMoveMemory (tpTokens, InfoBuffer, 1216)
.变量循环首 (1, tpTokens.PrivilegeCount, 1, i)
.如果真 (tpTokens.Privileges [i].Attributes ≠ 0)
s = 取空白文本 (256)
LookupPrivilegeName (字符 (0), tpTokens.Privileges [i].pLuid, s, 取文本长度 (s))
x.lValue = tpTokens.Privileges [i].pLuid.lowpart
x.sName = 子文本替换 (s, “”, 取空白文本 (0), , , 真)
s = 取空白文本 (256)
LookupPrivilegeDisplayName (取空白文本 (0), x.sName, s, 取文本长度 (s), LanguageID)
x.sDisplay = 子文本替换 (s, “”, 取空白文本 (0), , , 真)
加入成员 (r, x)
.如果真结束
.变量循环尾 ()
.如果真结束
.如果真结束
CloseHandle (hToken)
.如果真结束
数组 = r
'最好使用SE_DEBUG权限 因为又得进程是默认权限打不开的.
.版本 2
.子程序 _按钮1_被单击
.局部变量 p, PRIVILEGE, , "0"
.局部变量 i, 整数型
.局部变量 qq, 整数型
qq = OpenProcess (1024, 0, 到数值 (编辑框1.内容))
GetProcressPrivileges (qq, , p)
CloseHandle (qq)
.计次循环首 (取数组成员数 (p), i)
输出调试文本 (p [i].lValue, p [i].sName, p [i].sDisplay)
.计次循环尾 ()
'这个编辑框1是用来输入要检测的进程PID的
'输出的临时信息如下
权限编号 + 权限名称 +权限介绍
* 23
* SeChangeNotifyPrivilege
* 跳过遍历检查
* 20
* SeDebugPrivilege
* 调试程序
* 10
* SeLoadDriverPrivilege
* 装载和卸载设备驱动程序
* 25
* SeUndockPrivilege
* 从插接工作站中取出计算机
* 29
* SeImpersonatePrivilege
* 身份验证后模拟客户端
* 30
* SeCreateGlobalPrivilege
* 创建全局对象 |