2010-11-30 2 views
2

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

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

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

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

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

Спасибо!

ответ

2

Debug API - один вариант. Here является отправной точкой в ​​MSDN.

+0

Спасибо за ответ! Я думал об использовании некоторого отладочного API, но думал, что некоторые приложения, которые используют некоторые механизмы отладки, чтобы избежать взлома и/или уважения, могут изменить их поведение, если обнаруживают, что они отлаживаются fuzzer. Я полагаю, что если я не могу найти другой вариант, тогда мне придется использовать этот механизм отладки. – mfontanini 2010-11-30 14:34:28

+0

тем более разумно стрелять в людей, которые пытаются перепроектировать свой код. – 2010-11-30 14:44:30

1

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

SetErrorMode(SEM_NOGPFAULTERRORBOX); 

просмотра Количество деталей SetErrorMode в MSDN.

Читайте о технике инъекций здесь: Injective Code inside Import Table

2

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

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

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX); 

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

Смежные вопросы