Каждая загрузка Windows расставляет ядро, драйверы и системные структуры по новым адресам. Эта перестановка, известная как Address Space Layout Randomization, задумана как доспех: атакующий код, не знающий адресов, вынужден действовать вслепую. За годы доспех не раз трещал, и история его трещин поучительна сама по себе: она учит, что рандомизация - не стена, а подвижная дюна, и её прочность измеряется количеством бит энтропии и дисциплиной защиты указателей.
Как устроена рандомизация карт памяти в системе
Механизм работает на нескольких уровнях. При загрузке системы загрузчик выбирает случайный базовый адрес для образа ядра и ключевых областей: пространства сессий, пулов, системного кэша, области таблиц страниц. Для исполняемых образов рандомизация управляется флагом в заголовке PE-файла: модули, помеченные как совместимые с перемещением по случайному адресу, допускают перебазировку, унаследованные модули без флага загружаются по фиксированному адресу, возвращая тем самым всю машину назад, во времена полной предсказуемости адресов. Проверить конкретный файл можно двумя способами:
dumpbin /headers mydriver.sys | findstr /C:"Dynamic base"
link /dump /headers mydriver.sys | findstr /C:"DLL characteristics"
Ответ выглядит коротко и однозначно:
Dynamic base - DLL can move.
Если этой строки в выводе нет, образ собран без поддержки перемещения и ляжет по фиксированному адресу. Тот же флаг виден из отладчика по загруженному модулю: