Подавление аварийного завершения приложения
Независимо от того, каким путем shell-код захватил управление, он может зарегистрировать свой собственный обработчик структурных исключений. Это делается приблизительно так:
PUSH handler ; заносим адрес нашего SEH-обработчика
PUSH FS:[00000000h] ; заносим адрес на предыдущий SEH-фрейм
MOV FS,[00000000h], ESP ; регистрируем новый SEH-фрейм
Листинг 7 регистрация собственных обработчиков структурных исключений
Теперь, если shell-код нечаянно дотронется до запрещенной ячейки или совершит другую ошибку подобного типа, атакуемое приложение уже не будет захлопнуто операционной системой и управление вновь возвратиться shell-коду, давая ему понять, что туда ходить не надо и следует немедленно сменить тактику поведения, используя резервные алгоритмы жизнеобеспечения.
Исключения в процессе работы shell-кода могут происходить многократно, главное – следить за тем, чтобы не переполнился стек. Предельно допустимая степень вложенности хоть и велика, но все же не безгранична.