Windows ACCESS_MASK位段含义及16~23位值打印方法咨询
ACCESS_MASK 相关问题解答
问题1:ACCESS_MASK 中0~15位(Bits 0-15)的含义
这16位是对象特定权限位,没有全局统一的含义定义,具体解释完全匹配当前操作的安全对象类型:
- 操作文件/目录对象时,这部分对应文件专属的读数据、写数据、追加数据、执行、遍历子目录等细分权限
- 操作注册表项时,这部分对应注册表专属的查询键值、设置键值、创建子项、枚举子项等细分权限
- 操作进程、线程、服务、事件、互斥量等内核对象时,也各自有一套对应的专属权限定义
你代码里直接打印整个Mask得到197055,就是因为这个值是多组权限按位或叠加的结果:197055转十六进制是0x301BF,其中低16位值为0x01BF,就是当前操作对象的专属权限组合。
问题2:提取并打印ACCESS_MASK中16~23位取值的方法
16~23位是所有类型安全对象通用的标准权限位,直接通过位运算提取即可,示例代码如下:
// 标准权限位掩码,对应16~23位共8个bit #define STANDARD_RIGHTS_MASK 0xFF0000 // 按位与取出目标位段,再右移16位把值对齐到最低位,得到0~255范围的结果 BYTE standard_rights_val = (BYTE)((ace->Mask & STANDARD_RIGHTS_MASK) >> 16); // 打印结果,可同时输出十六进制和十进制方便对照 std::wcout << L"16~23位(标准权限)取值: 0x" << std::hex << standard_rights_val << L" (" << std::dec << standard_rights_val << L")\n";
这几个位对应的常用标准权限定义在Winnt.h头文件中,日常开发最常用的有4个:
- 第16位(移位后值为1,对应掩码
0x10000):DELETE,删除对象的权限 - 第17位(移位后值为2,对应掩码
0x20000):READ_CONTROL,读取对象安全描述符中DACL、所有者信息的权限 - 第18位(移位后值为4,对应掩码
0x40000):WRITE_DAC,修改对象自由访问控制列表(DACL)的权限 - 第19位(移位后值为8,对应掩码
0x80000):WRITE_OWNER,修改对象所有者标识的权限
剩余20~23位为系统保留位,常规业务开发几乎不会涉及。
回到你之前的输出值197055(0x301BF),提取16~23位的结果是0x30也就是48,对应DELETE | READ_CONTROL两个标准权限的组合,和你代码里判断DELETE权限命中的逻辑完全一致。
内容的提问来源于stack exchange,提问作者FAN
相关产品推荐
相关产品推荐

