我的问题:我正在查看IMAGE_SECTION_HEADER
结构的特征成员。我想知道某个部分是否可执行。我该如何检查?特征成员是DWORD
,我希望能够知道它是否包含值IMAGE_SCN_MEM_EXECUTE
(0x20000000
)。这个计算结果怎么样?我猜我必须使用模运算符,但不知道如何。
答案 0 :(得分:7)
if (imageSectionHeader.Characteristics & IMAGE_SCN_MEM_EXECUTE)
{
// Do work here...
}
这称为掩蔽。您使用Characteristics
掩码屏蔽IMAGE_SCN_MEM_EXECUTE
值,以查看是否设置了这些特定位。如果IMAGE_SCN_MEM_EXECUTE
掩码中设置的所有位也设置在Characteristics
值中,则上述条件才为真。
答案 1 :(得分:3)
看起来IMAGE_SECTION_HEADER::Characteristics
有点字段。您想检查IMAGE_SCN_MEM_EXECUTE
表示的位是否已设置。为此,您可以在Characteristics
和IMAGE_SCN_MEM_EXECUTE
:
header.Characteristics & IMAGE_SCN_MEM_EXECUTE
转换为bool
时,仅当true
位置位时,此表达式才为IMAGE_SCN_MEM_EXECUTE
。
答案 2 :(得分:0)
找到关于Windows标志设计的一些事实:
假设标志A是" 0x0001000",B是" 0x0002000"和C是" 0x0003000"。
特征可能包含多字节标志。假设exe包含标志A& B. 那么特征值将是" 0x0003000"。
如果我们正在检查(特征&(A | B)),这将是可以的,但(特征&(C))也将返回true。
但是微软设计了标志,没有多个标志可以组合在一起形成第三个标志。 如果我们检查特征的可能值,则会跳过一些中间值以避免上述问题。
按位AND(&)将始终用于标记检查。
对于安全性,还可以编写如下表达式: 如果我们想检查Flag1& Flag2 in Characteristics。
((特征&(Flag1 | Flag2 |标志列表中的最高位标志)==(Flag1 | Flag2))