У меня включен aslr, и когда я играю в какую-то игру под названием «штурмовой куб», базовый адрес этой программы всегда один и тот же (00400000), я получаю его, выполняя GetModuleHandle (NULL) попытался получить его с помощью windbg, и он также говорит 00400000, и мне было интересно, почему это никогда не меняется, поскольку для других программ он всегда меняется?(Windows) Базовый адрес какой-либо программы никогда не изменяется
ответ
Даже если у вас есть ASLR включен глобально, Windows применяет его только к приложениям, которые специально указывают, что они поддерживают его. В противном случае можно было бы неожиданно неожиданно вызвать устаревшие приложения, что привело бы к проблемам с совместимостью. Все исполняемые файлы и поддерживающие DLL должны явно указывать, что они поддерживают ASLR.
Указывая, что вы поддерживаете ASLR, это то, что вы делаете при связывании объектного файла, указав the /DYNAMICBASE
option (по крайней мере, если вы используете компоновщик Microsoft). Современные версии компоновщика включили его по умолчанию, но если ваша игра была скомпилирована с более старой версией набора инструментов до того, как поддержка динамического адреса переместилась по умолчанию (, например, VS 2008 и ранее) или с помощью компоновщика с другого вендором, вполне вероятно, что он не был связан с поддержкой ASLR.
Это называется в the relevant MSDN article (курсив добавлен):
ASLR перемещает исполняемые образы в случайных местах при загрузке системы, что делает его более трудным для вредоносного кода, чтобы работать предсказуемо. Для компонента, поддерживающего ASLR, все компоненты, которые он загружает, также должны поддерживать ASLR. Например, если A.exe потребляет B.dll и C.dll, все три должны поддерживать ASLR. По умолчанию Windows Vista и последующие будут рандомизировать системные DLL и EXE, но библиотеки DLL и EXE, созданные независимыми поставщиками ПО, должны выбрать для поддержки ASLR, используя опцию компоновщика
/DYNAMICBASE
.
Смотрите также: Vista ASLR is not on by default for image base addresses
Обратите внимание, что вы можете изменить РЕ заголовок существующего двоичного файла, заставляя его поддерживать ASLR, запустив утилиту editbin
доступную с SDK. Как и в случае с компоновщиком, the /dynamicbase
switch включит его.
Или, вы можете заставить ASLR глобально, отредактировав следующий раздел реестра:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
Конечно, ни один из них на самом деле изменить код, так что если есть проблемы с совместимостью, то приложение будет ломаться.
Да, я полностью забыл об этом, спасибо. – beginnerl