(Windows) Базовый адрес какой-либо программы никогда не меняется
Я включил aslr, и когда я играю в какую-нибудь игру, называемую Assault Cube, базовый адрес этой программы всегда одинаков (00400000). Я получаю его, выполняя GetModuleHandle(NULL), также пытаюсь получить его с помощью windbg, и он также говорит 00400000, и я был интересно, почему это никогда не меняется, потому что для других программ оно всегда меняется?
1 ответ
Даже если у вас включен глобальный ASLR, Windows применяет его только к приложениям, которые указывают, что они поддерживают его. В противном случае старые приложения могут неожиданно аварийно завершиться, что приведет к проблемам с совместимостью. Все исполняемые файлы и поддерживающие библиотеки DLL должны явно указывать, что они поддерживают ASLR.
Указание на то, что вы поддерживаете ASLR, - это то, что вы делаете при связывании объектного файла, указывая /DYNAMICBASE
вариант (по крайней мере, если вы используете компоновщик Microsoft). В современных версиях компоновщика он включен по умолчанию, но если ваша игра была скомпилирована с более старой версией набора инструментов до того, как поддержка динамического перемещения адресов была по умолчанию (например, VS 2008 и более ранние версии) или с компоновщиком от другого поставщика, вероятно, это не было связано с поддержкой ASLR.
Об этом говорится в соответствующей статье MSDN (выделение добавлено):
ASLR перемещает исполняемые образы в случайные места при загрузке системы, что затрудняет предсказуемую работу кода эксплойта. Чтобы компонент поддерживал ASLR, все загружаемые им компоненты также должны поддерживать ASLR. Например, если A.exe использует B.dll и C.dll, все три должны поддерживать ASLR. По умолчанию Windows Vista и более поздние версии будут рандомизировать системные библиотеки DLL и EXE-файлы, но библиотеки DLL и EXE-файлы, созданные независимыми поставщиками программного обеспечения, должны включить поддержку ASLR с помощью
/DYNAMICBASE
опция компоновщика.
См. Также: Vista ASLR не включена по умолчанию для базовых адресов изображений.
Обратите внимание, что вы можете изменить PE-заголовок существующего двоичного файла, заставив его поддерживать ASLR, запустив editbin
Утилита доступна с SDK. Как и в случае с компоновщиком, /dynamicbase
переключатель включит его.
Или вы можете принудительно включить ASLR, отредактировав следующую запись реестра:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
Конечно, ни один из них на самом деле не меняет код, поэтому, если возникнут проблемы с совместимостью, приложение сломается.