2010-11-30 33 views
2

Je développe une application de fuzzing C++ multi-plateforme. L'application génère un processus enfant et vérifie si elle s'est arrêtée de manière inattendue. J'ai déjà réussi à le faire sur Linux, cependant, le mécanisme de gestion des exceptions de Windows rend les choses difficiles pour moi.Attraper des exceptions de processus enfants sur Windows

Mon code maintenant fait ce qui suit: - Appelez CreateProcess pour engendrer le processus. - WaitForSingleObject en attente de l'achèvement. - Appelez ensuite GetExitCodeProcess et vérifiez si le code de sortie correspond à une exception.

Tout fonctionne comme prévu, je l'ai testé avec une application de test de déréférencement null, et je peux attraper l'exception gracieusement. Cependant, chaque fois que je teste cela, une boîte de message d'erreur Windows apparaît en me disant d'envoyer ou de ne pas envoyer le rapport d'erreur. Étant donné que le fuzzer est supposé être une application de test automatique, je devrais d'une manière ou d'une autre désactiver cette notification, de sorte que même si une exception est interceptée, le fuzzer peut continuer à tester.

J'ai déjà essayé d'installer un gestionnaire SEH, mais je n'ai pas eu de chance (apparemment, ces gestionnaires ne sont pas hérités par les processus enfants). J'ai lu quelque chose sur l'utilisation de la gestion des exceptions vectorielles, mais supposons que ce soit la même chose, je crois que les gestionnaires de vecteurs ne sont pas hérités.

Quelqu'un pourrait-il m'aider avec ce problème? Je ne sais pas quoi chercher, j'ai déjà beaucoup googlé et n'ai rien trouvé.

Merci!

Répondre

2

Debug API est une option. Here est un point de départ dans MSDN.

+0

Merci pour la réponse! J'avais pensé à utiliser une API de débogage, mais je pensais que certaines applications qui utilisent des mécanismes anti-débogage pour éviter le cracking et/ou la révérence pourraient modifier leur comportement si elles détectent qu'elles sont déboguées par le fuzzer. Je suppose que si je ne peux pas trouver une autre option, alors je vais devoir utiliser ce mécanisme de débogage. – mfontanini

+0

raison de plus pour tirer sur les gens qui essaient de faire de la rétro-ingénierie prouver leur code. –

+0

Ça a marché! Merci beaucoup: D – mfontanini

2

Suite à la réponse de FRAST, vous pouvez reproduire le processus en tant que enfant d'un processus avec un SetErrorMode approprié. Ce paramètre (héritable) détermine quelles erreurs entraîneront l'apparition de boîtes de dialogue. J'ai trouvé votre question tout en essayant d'obtenir exactement la même chose pour une application de test automatisée.

Pour éviter les boîtes de dialogue d'erreur, utilisez

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX); 

injection est probablement excessif - préférable d'utiliser un processus d'emballage.

+0

Pouvez-vous partager ce qui est un processus d'encapsulation qui peut gérer cela? – Robin

+0

"Wrapper" est un nom générique pour un processus/une fonction/une méthode dont le seul but est d'appeler et de nettoyer ultérieurement un autre processus/une autre fonction/méthode. Vous pouvez créer un processus enfant dans Windows en utilisant https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx – tucuxi

+0

Je vois.Si l'application enfant fait SetErrorMode, nous aurons toujours besoin de l'injection – Robin