检查是否在DWORD中设置了某些位

时间:2014-02-02 20:47:06

标签: c++

我的问题:我正在查看IMAGE_SECTION_HEADER结构的特征成员。我想知道某个部分是否可执行。我该如何检查?特征成员是DWORD,我希望能够知道它是否包含值IMAGE_SCN_MEM_EXECUTE0x20000000)。这个计算结果怎么样?我猜我必须使用模运算符,但不知道如何。

3 个答案:

答案 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表示的位是否已设置。为此,您可以在CharacteristicsIMAGE_SCN_MEM_EXECUTE

之间执行按位AND
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))