2010-11-30 18 views
2

私はマルチプラットフォームのC++ファジーアプリケーションを開発しています。アプリは子プロセスを生成し、それが突然停止したかどうかをチェックします。私はすでにLinux上でこれを行うことができましたが、Windowsの例外処理の仕組みは私には難しいことです。Windows上で子プロセス例外をキャッチ

私のコードは今すぐ次の処理を行います。 - CreateProcessを呼び出してプロセスを起動します。 - WaitForSingleObjectが終了するのを待機する。 - GetExitCodeProcessを呼び出して、終了コードが例外に対応するかどうかを確認します。

すべてが正常に動作します。私はヌル逆参照テストアプリケーションでテストしましたが、例外を正常にキャッチできます。しかし、私がこれをテストするたびに、Windowsエラーメッセージボックスが表示され、エラーレポートを送信するかどうかを伝えます。 fuzzerは自動テストアプリケーションであるため、この通知を無効にする必要があるため、例外が検出されてもfuzzerはテストを続けることができます。

私は既にSEHハンドラをインストールしようとしましたが、運がありませんでした(明らかに、これらのハンドラは子プロセスに継承されません)。ベクタリングされた例外処理の使い方を読んだことがありますが、同じであると仮定します。ベクターハンドラは継承されていないと思います。

誰でもこの問題を解決できますか?私は何を探すべきかわからない、私はすでに多くのグーグルで探検していて、何も見つけていない。

ありがとうございます!

答えて

2

Debug APIの1つのオプションです。 HereはMSDNの出発点です。

+0

答えをありがとう!私はいくつかのデバッグAPIを使用することを考えていましたが、いくつかのアンチ・デバッグ・メカニズムを使用してクラッキングや反復を回避するアプリケーションが、ファジーによってデバッグされていることを検出すると、私は別のオプションを見つけることができない場合、私はこのデバッグのメカニズムを使用する必要がありますと思います。 – mfontanini

+0

コードをリバースエンジニアリングしようとする人々を撃つためにはるかに多くの理由があります。 –

+0

それは働いた!ありがとうたくさん:D – mfontanini

1

は、あなたの子プロセスに以下のコードを挿入してください:

SetErrorMode(SEM_NOGPFAULTERRORBOX); 

検索MSDNでSetErrorModeの詳細が表示されます。ここでの注入技術に関する

読む:frastの答えに続き Injective Code inside Import Table

2

は、あなたは、適切なSetErrorModeとプロセスのとしてプロセスを生成することができます。この(継承可能な)設定は、どのエラーがダイアログをポップアウトさせるかを決定します - 自動テストアプリケーションで全く同じことを達成しようとしている間にあなたの質問を見つけました。より良いラッパープロセスを使用する - すべてのエラーダイアログを回避するために

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX); 

を使用インジェクションは、おそらく過剰です。

+0

これを処理できるラッパープロセスは何ですか? – Robin

+0

"Wrapper"は、プロセス/関数/メソッドの総称で、別のプロセス/関数/メソッドを呼び出して後でクリーンアップすることのみを目的としています。 Windowsで子プロセスを作成するには、https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx – tucuxi

+0

を参照してください。子アプリがSetErrorModeを実行する場合、私たちはまだ注射が必要です – Robin