. Мой вопрос: я рассматриваю элемент «Характеристики» структуры IMAGE_SECTION_HEADER
. Я хочу знать, является ли определенный раздел исполняемым или нет. Как я могу проверить это? Элемент характеристик - DWORD
, и я хочу знать, содержит ли оно значение IMAGE_SCN_MEM_EXECUTE
(0x20000000
). Каким будет расчет для этого? Я предполагаю, что я должен использовать оператор modulo, но понятия не имею, как это сделать.Проверьте, установлены ли определенные биты в DWORD
ответ
if (imageSectionHeader.Characteristics & IMAGE_SCN_MEM_EXECUTE)
{
// Do work here...
}
Это называется маскировка. Вы маскируете значение Characteristics
с помощью маски IMAGE_SCN_MEM_EXECUTE
, чтобы определить, установлены ли эти конкретные биты. Приведенное выше условие будет истинным только в том случае, если все биты, установленные в маске IMAGE_SCN_MEM_EXECUTE
, также установлены в значении Characteristics
.
Большое спасибо, это именно то, что я искал! Я даже не знал о & operator. Мне нужно подождать еще 10 минут, чтобы отметить ваш ответ как правильный. – user2073973
@ user2073973: Я уверен, что есть много других полезных вещей, которые C++ может предложить вам, когда вы продолжаете его использовать. книга на языке C++ не повредит, я полагаю :) –
@ VioletGiraffe Я не думаю, что побитовое и только C++;) – Paranaix
Похоже, 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
бит установлен.
Насколько изобличен этот расчет? – user2073973
@ user2073973 Результат побитового И будет иметь биты, установленные только там, где оба операнда имеют биты. Например, '0011 & 0101' предоставит вам' 0001', потому что в обоих случаях установлен только последний бит. Теперь каждый бит в «Характеристика» представляет собой конкретную характеристику. Чтобы отфильтровать определенный бит, вы можете поразрядно И это со значением, содержащим только этот бит. Например, если я хочу проверить, установлен ли третий бит (справа) в '0101', я могу сделать' 0101 & 0100'. Это дало бы мне «0100». Поскольку это больше нуля, оно станет «истинным». –
Найдено некоторые факты о дизайне окна флага:
Давайте предположим, что флаг А «0x0001000», В «0x0002000» и С «0x0003000».
Характеристики могут содержать многобайтовый флаг. Предположим, что exe содержит флаг A & B. Тогда значение характеристик будет «0x0003000».
если мы проверяем (характеристики & (A | B)), все будет хорошо, но (характеристики & (C)) также вернет true.
Но Microsoft разработала флаги таким образом, чтобы не было нескольких флагов, имеющих возможность объединиться и сформировать третий флаг. Если мы проверим возможные значения характеристик близко, есть некоторые промежуточные значения, которые пропускаются, чтобы избежать вышеуказанной проблемы.
Побитовое И (&) всегда будет работать для проверки флага.
Для безопасности также можно написать выражение следующим образом: , если мы хотим проверить флажок 1 & Flag2 в характеристиках.
((Характеристики & (flag1 | flag2 | Самый высокий флаг Биты в списке флага) == (flag1 |. Flag2))
- 1. Проверьте, установлены ли все биты в BitSet равным true
- 2. Проверьте, установлены ли переменные
- 3. Проверьте, установлены ли переключатели
- 4. Проверьте, установлены ли два вара?
- 5. Проверьте, установлены ли модули правильно
- 6. Переключая определенные множественные биты
- 7. Биты не установлены для ряда golang
- 8. Проверьте, установлены ли Карты Google - iOS 10.2.1
- 9. Magento CE - проверьте, установлены ли исправления
- 10. Проверьте, установлены ли все версии cocoapods
- 11. Проверьте, установлены ли службы с помощью C
- 12. Держите определенные биты из расчета
- 13. Проверьте, установлены ли приложения Facebook, LinkedIn, Gmail.
- 14. Как проверить определенные биты переменной в C++?
- 15. Проверьте MSWord установлены в системе
- 16. Как я могу проверить, установлены ли все биты или все биты нет?
- 17. Проверьте, существуют ли определенные атрибуты в элементе
- 18. Как установить определенные биты? - в шестнадцатеричном формате?
- 19. Извлечь биты, которые установлены в HashSet <uint>?
- 20. Как понять, какие биты установлены в 1 в битарре
- 21. C - Определение всех, если все четные биты установлены в 1
- 22. Точно проверьте, содержит ли кортеж определенные значения
- 23. Проверьте, содержит ли слово определенные буквы?
- 24. Проверьте, содержит ли строка определенные символы
- 25. Проверьте, содержит ли URL определенные строки
- 26. Проверьте, содержит ли TStringList определенные символы?
- 27. Проверьте, не установлены ли локальный и онлайн-файл в Dropbox
- 28. Проверьте, установлены ли даты установки устройства в iOS
- 29. Проверьте, установлены ли флажки в той же строке
- 30. Как читать определенные биты unsigned int
Я взял смелость уточнения названия будет больше пользы для будущих поколений –
' bitfield' имеет определенное значение в C и C++ (и этот вопрос не относится к нему). –
@JoeGauterin: good catch. –