Вот что я бы попробовал:
Помните, что дескриптор модуля HMODULE
на самом деле является базовым адресом образа модуля. Вы можете использовать GetModuleHandle
для получения этого значения. Если вы сравните это с базовым адресом в необязательных значениях заголовка изображения, мы ожидаем, что эти два значения будут разными, когда ASLR включен.
Имейте в виду, что это будет четким показателем ASLR, только если GetModuleHandle
используется в определенных системных DLL; это будет работать для kernel32
, поскольку это не типичный кандидат для перемещения изображения:
- Системным DLL-библиотекам Microsoft присваиваются уникальные рекомендуемые базовые адреса; и
- Это одна из первых библиотек DLL, сопоставленных с адресным пространством процесса.
Поскольку kernel32
обычно не перемещается, если ASLR выключен, разумно ожидать его загрузки по рекомендованному базовому адресу.
Как получить рекомендуемый базовый адрес из заголовков изображений? Самый простой способ - использовать утилиту DUMPBIN
, включенную в Visual C ++. Если вы предпочитаете делать это программно, вам нужно будет немного разобраться в заголовках исполняемого образа, пока вы не найдете поле IMAGE_OPTIONAL_HEADER
структуры ImageBase
. Для получения дополнительной информации о PE-заголовках я бы порекомендовал "Углубленный взгляд на формат исполняемых файлов Win32" , автор Matt Pietrek.