Я прочитал из Google, что он используется для контроля переполнения буфера на уровне приложения и вызывается CRT.
Это также говорит о том, что
«По сути, при входе в функцию, защищенную от переполнения, файл cookie помещается в стек, а при выходе значение в стеке сравнивается с глобальным файлом cookie. Любая разница между ними указывает на то, что произошло переполнение буфера и приводит к немедленное прекращение действия программы «.
Но я не мог понять, как это работает? Пожалуйста помоги.
«Cookie» — это не более чем произвольное значение.
Итак, основная идея заключается в том, что вы записываете выбранное значение в стек перед вызовом функции. Хотя это, вероятно, не очень хорошее значение, давайте произвольно выберем 0x12345678 в качестве значения.
Затем он вызывает функцию.
Когда функция возвращается, она возвращается к правильному месту в стеке и сравнивает это значение с 0x12345678. Если значение изменилось, это указывает на то, что вызванная функция записана вне области стека, в которую было разрешено записывать, поэтому она (и этот процесс в целом) считается ненадежной и закрывается.
В этом случае вместо выбора 0x12345678 система выбирает другое значение на регулярной основе, например при каждом запуске системы. Это означает, что с меньшей вероятностью случайно будет получено правильное значение — это может произойти один раз, но если оно записывает определенное значение там, когда изменяется правильное / выбранное значение, оно в итоге записывает неправильное значение, и проблема будет обнаружена.
Вероятно, также стоит отметить, что эта основная идея не особенно нова. Например, еще во времена MS-DOS компиляторы Borland и Microsoft записывали известное значение в самый конец стека перед вызовом main
в вашей программе. После main
вернулись, они перепроверили это значение. Затем будет выведено сообщение об ошибке (прямо при выходе из программы), если значение не соответствует ожидаемому.
Это именно то, что говорится в объяснении, но вы можете заменить «cookie» на «некоторое значение». Когда функция вызывается, она помещает некоторая ценность в стеке. Когда функция возвращается, она проверяет это снова, чтобы видеть, изменилось ли это.
Нормальное поведение функции — не касаться области памяти. Если значение там изменилось, это означает, что код функции каким-то образом перезаписал его, и это означает, что произошел переполнение буфера.