WinDbg内核模式下如何查看令牌的命名安全属性?
内核模式WinDbg查看令牌命名安全属性的方法
在WinDbg内核模式下,!token命令不会显示令牌的命名安全属性,需要手动解析内核数据结构来获取,步骤如下:
1. 获取目标进程的令牌对象地址
- 先定位目标进程的
_EPROCESS结构:
输出中会显示进程的OBJECT地址(例如!process 0 0 <进程名>PROCESS ffffa80123456780)。 - 解析
_EPROCESS的Token成员,提取令牌对象地址:
从dt nt!_EPROCESS Token ffffa80123456780_EX_FAST_REF结构中取出Object字段的值,这就是令牌(_TOKEN)的实际地址。
2. 定位令牌的安全属性结构
- 查看
_TOKEN结构中的SecurityAttributes成员:
得到dt nt!_TOKEN SecurityAttributes <令牌地址>_TOKEN_SECURITY_ATTRIBUTES结构的地址。 - 解析该结构,获取属性数量和属性数组指针:
重点关注dt nt!_TOKEN_SECURITY_ATTRIBUTES <SecurityAttributes地址>AttributeCount(属性总数)和Attributes(指向_TOKEN_SECURITY_ATTRIBUTE数组的指针)。
3. 遍历并解析每个命名安全属性
针对每个属性,依次执行以下操作:
- 查看单个属性的结构:
其中dt nt!_TOKEN_SECURITY_ATTRIBUTE <属性数组地址 + n*sizeof(nt!_TOKEN_SECURITY_ATTRIBUTE)>n是从0开始的属性索引。 - 查看属性名称:
从_TOKEN_SECURITY_ATTRIBUTE的Name字段(_UNICODE_STRING类型)中取出Buffer地址,用du命令显示Unicode字符串:du <Name.Buffer地址> - 查看属性值:
先看Value.Type字段,对应TOKEN_SECURITY_ATTRIBUTE_TYPE枚举(例如1代表UINT64类型,2代表字符串类型),再根据类型解析:- UINT64类型:查看
Value.UInt64数组的值:dt nt!_TOKEN_SECURITY_ATTRIBUTE_VALUE.UInt64 <属性地址> + offsetof(nt!_TOKEN_SECURITY_ATTRIBUTE, Value) - 字符串类型:取出
Value.String.Buffer地址,用du命令显示:du <Value.String.Buffer地址>
- UINT64类型:查看
示例操作流程
假设目标进程的
_EPROCESS地址为fffffa8012345678:
- 执行
dt nt!_EPROCESS Token fffffa8012345678,得到令牌地址fffff8012345abcd- 执行
dt nt!_TOKEN SecurityAttributes fffff8012345abcd,得到SecurityAttributes地址fffff8012345wxyz- 执行
dt nt!_TOKEN_SECURITY_ATTRIBUTES fffff8012345wxyz,得到AttributeCount : 1,Attributes : 0xfffff8012345abcd- 执行
dt nt!_TOKEN_SECURITY_ATTRIBUTE 0xfffff8012345abcd,得到Name.Buffer : 0xfffff8012345efgh,Value.Type : 1- 执行
du 0xfffff8012345efgh,显示属性名TSA://ProcUnique- 执行
dt nt!_TOKEN_SECURITY_ATTRIBUTE_VALUE.UInt64 0xfffff8012345abcd + offsetof(nt!_TOKEN_SECURITY_ATTRIBUTE, Value),查看UINT64类型的属性值。
内容的提问来源于stack exchange,提问作者Anton Kukoba
相关产品推荐
相关产品推荐

