Перехват исключений дочерних процессов в Windows - PullRequest
2 голосов
/ 30 ноября 2010

Я занимаюсь разработкой мультиплатформенного приложения для фаззинга на C ++.Приложение порождает дочерний процесс и проверяет, не остановился ли он неожиданно.Я уже успел сделать это в Linux, однако механизм обработки исключений в Windows затрудняет мне работу.

Мой код прямо сейчас делает следующее: - Вызывает CreateProcess для запуска процесса.- WaitForSingleObject, чтобы дождаться его завершения.- Затем вызовите GetExitCodeProcess и проверьте, соответствует ли код завершения исключению.

Все работает как надо, я протестировал его с помощью тестового приложения с нулевой разыменовкой и могу изящно перехватить исключение.Тем не менее, каждый раз, когда я проверяю это, появляется окно сообщения об ошибке Windows, сообщающее мне, отправлять или не отправлять отчет об ошибке.Поскольку предполагается, что фаззер - это приложение для автоматического тестирования, мне нужно как-то отключить это уведомление, чтобы даже в случае обнаружения исключения фаззер мог продолжить тестирование.

Я уже пытался установитьОбработчик SEH, но не повезло (очевидно, эти обработчики не наследуются дочерними процессами).Я читал кое-что об использовании векторной обработки исключений, но предположим, что это будет то же самое, я считаю, что векторные обработчики не наследуются.

Может кто-нибудь помочь мне с этой проблемой?Я не знаю, что искать, я уже много гуглил и ничего не нашел.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 января 2011

Следуя ответу frast, вы можете порождать процесс как дочерний процесса с подходящим SetErrorMode . Этот (наследуемый) параметр определяет, какие ошибки приведут к появлению диалогов - я нашел ваш вопрос, пытаясь добиться того же самого для приложения автоматического тестирования.

Чтобы избежать каких-либо диалогов об ошибках, используйте

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX);

Впрыск, вероятно, излишний - лучше использовать процесс-обертку.

2 голосов
/ 30 ноября 2010

API отладки является одним из вариантов. Здесь является отправной точкой в ​​MSDN.

1 голос
/ 30 ноября 2010

Попробуйте ввести следующий код в ваш дочерний процесс:

SetErrorMode(SEM_NOGPFAULTERRORBOX);

Поиск сведений о SetErrorMode в MSDN.

Читайте о технике инъекции здесь: Инъективный код внутри таблицы импорта

...