我们之前讨论过简单枚举(点击查看),但有一种不同类型的枚举,你可能会偶尔遇到或需要手动创建。它们用于表示可能在整数值中设置的各种位(或标志)。例如,Unix 文件系统上的文件模式包含访问权限位(你可以在 ls
的输出中看到它们,像 -rwxr-xr-x
这样的字符串),每个位都有一个对应的常量:
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
每当你有一个可以表示为位值组合的值时,你可以使用 Bitmask 枚举(在 8.4 之前称为 位域,但为了减少与结构中的位域混淆而更名)。
要创建一个 Bitmask 枚举,请在“添加类型”对话框的“枚举”选项卡中勾选“Bitmask”:
新的枚举会获得 IDA 特定的 __bitmask
属性:
FFFFFFFF enum __bitmask __oct FILE_PERMS // 4 bytes
FFFFFFFF {
FFFFFFFF };
当你添加新成员(快捷键 N)时,IDA 会自动提供下一个空闲位作为值:
你也可以使用 C 语法选项卡编辑器,但你需要自己确保没有重叠的位。
要在反汇编或伪代码中将枚举应用于整数值,你可能需要显式调用“编辑 > 操作数类型 > 枚举成员...”操作(或使用 M 快捷键),因为 Bitmask 枚举并不总是出现在上下文菜单中。
IDA 然后会将值显示为枚举成员的组合:
.data:00001000 dd S_IWGRP or S_IXGRP or S_IXUSR
参见:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于