2014-02-02 3 views
1

. Мой вопрос: я рассматриваю элемент «Характеристики» структуры IMAGE_SECTION_HEADER. Я хочу знать, является ли определенный раздел исполняемым или нет. Как я могу проверить это? Элемент характеристик - DWORD, и я хочу знать, содержит ли оно значение IMAGE_SCN_MEM_EXECUTE (0x20000000). Каким будет расчет для этого? Я предполагаю, что я должен использовать оператор modulo, но понятия не имею, как это сделать.Проверьте, установлены ли определенные биты в DWORD

+0

Я взял смелость уточнения названия будет больше пользы для будущих поколений –

+0

' bitfield' имеет определенное значение в C и C++ (и этот вопрос не относится к нему). –

+0

@JoeGauterin: good catch. –

ответ

6
if (imageSectionHeader.Characteristics & IMAGE_SCN_MEM_EXECUTE) 
{ 
    // Do work here... 
} 

Это называется маскировка. Вы маскируете значение Characteristics с помощью маски IMAGE_SCN_MEM_EXECUTE, чтобы определить, установлены ли эти конкретные биты. Приведенное выше условие будет истинным только в том случае, если все биты, установленные в маске IMAGE_SCN_MEM_EXECUTE, также установлены в значении Characteristics.

+0

Большое спасибо, это именно то, что я искал! Я даже не знал о & operator. Мне нужно подождать еще 10 минут, чтобы отметить ваш ответ как правильный. – user2073973

+0

@ user2073973: Я уверен, что есть много других полезных вещей, которые C++ может предложить вам, когда вы продолжаете его использовать. книга на языке C++ не повредит, я полагаю :) –

+0

@ VioletGiraffe Я не думаю, что побитовое и только C++;) – Paranaix

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 бит установлен.

+0

Насколько изобличен этот расчет? – user2073973

+0

@ user2073973 Результат побитового И будет иметь биты, установленные только там, где оба операнда имеют биты. Например, '0011 & 0101' предоставит вам' 0001', потому что в обоих случаях установлен только последний бит. Теперь каждый бит в «Характеристика» представляет собой конкретную характеристику. Чтобы отфильтровать определенный бит, вы можете поразрядно И это со значением, содержащим только этот бит. Например, если я хочу проверить, установлен ли третий бит (справа) в '0101', я могу сделать' 0101 & 0100'. Это дало бы мне «0100». Поскольку это больше нуля, оно станет «истинным». –

0

Найдено некоторые факты о дизайне окна флага:

Давайте предположим, что флаг А «0x0001000», В «0x0002000» и С «0x0003000».

Характеристики могут содержать многобайтовый флаг. Предположим, что exe содержит флаг A & B. Тогда значение характеристик будет «0x0003000».

если мы проверяем (характеристики & (A | B)), все будет хорошо, но (характеристики & (C)) также вернет true.

Но Microsoft разработала флаги таким образом, чтобы не было нескольких флагов, имеющих возможность объединиться и сформировать третий флаг. Если мы проверим возможные значения характеристик близко, есть некоторые промежуточные значения, которые пропускаются, чтобы избежать вышеуказанной проблемы.

Побитовое И (&) всегда будет работать для проверки флага.

Для безопасности также можно написать выражение следующим образом: , если мы хотим проверить флажок 1 & Flag2 в характеристиках.

((Характеристики & (flag1 | flag2 | Самый высокий флаг Биты в списке флага) == (flag1 |. Flag2))

Смежные вопросы