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

问题描述 投票:1回答:3

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

c++
3个回答
7
投票
if (imageSectionHeader.Characteristics & IMAGE_SCN_MEM_EXECUTE)
{
   // Do work here...
}

这称为掩蔽。您正在使用Characteristics掩码屏蔽IMAGE_SCN_MEM_EXECUTE值,以查看是否设置了这些特定位。如果在IMAGE_SCN_MEM_EXECUTE掩码中设置的所有位也在Characteristics值中设置,则上述条件才为真。


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


0
投票

找到一些关于Windows标志设计的事实:

让我们假设标志A是“0x0001000”,B是“0x0002000”,C是“0x0003000”。

特征可能包含多字节标志。假设exe包含标志A和B.那么特征值将是“0x0003000”。

如果我们正在检查(特征&(A | B)),这将是可以的,但(特征和(C))也将返回true。

但微软设计标志的方式是没有多个标志可以组合在一起形成第三个标志。如果我们检查特征的可能值,则会跳过一些中间值以避免上述问题。

按位AND(&)将始终用于标志检查。

对于安全性,还可以按如下方式编写表达式:如果我们要检查特征中的Flag1和Flag2。

((特征&(Flag1 | Flag2 |标志列表中的最高位标志)==(Flag1 | Flag2))

© www.soinside.com 2019 - 2024. All rights reserved.