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