Я запускаю программу на своей машине с Windows 10 с помощью windbg и позволяю ей ломаться на начальной точке останова. Я беру адрес физического дна стека (stackBase TEB) и вычитаю значение rsp
ntdll!LdrInitializeThunk
. Я просто сделал это 5 раз на одной и той же программе, и я получил 5 различных значений:Почему смещение «логического дна» и «физического дна» стека случайное?
0x600
0x9f0
0xa40
0x5d0
0x570
Вы получаете подобные результаты, если вы делаете то же самое с ntdll!RtlUserThreadStart
и т.д. Это говорит о том, что «логическое дно» стека несколько рандомизирован. Почему это? Это какой-то «мини-ASLR» внутри стека? Является ли это документированным где угодно?
Я надеялся, что у кого-то будет подробный ответ, но запуск процесса FWIW по своей сути непредсказуем. Если вы используете Process Monitor для просмотра того, что происходит, когда запускается какой-либо конкретный исполняемый файл, он может время от времени различаться, по-видимому, случайным образом. Я действительно не знаю, почему. –