2009-06-14 1 views
1

私はquestionを投稿して、ポインタのアクセシビリティを検証しました。結論は、IsBadReadPtrを使用してポインタをチェックするか、SEHを使用して例外を捕捉するか(どちらも使用しないようにして、アプリケーションをデバッグすることが好ましいが、ここでは問題ではない)。SEH、アクセス違反とスタックガードページ

IsBadReadPtrは、他の理由の中でも特にポインタを読み込もうとしていて、何の例外もキャッチしないために悪いと言われています。それはcatch a stack guard page exceptionかもしれません、そして、それはスタックを拡大したはずのメモリマネージャに達するのを防ぎます。

SEHを使用してEXCEPTION_ACCESS_VIOLATION例外のみをキャッチすると、同じ問題が発生しますか?

もう1つ:SEHを使用することの意義は何ですか? Thisの記事では、「コンパイラはSEHで保護されたコードでフロー解析を実行できません。 __tryブロックの中で関数を呼び出すのはどうですか?コンパイラは呼び出される関数をまったく最適化しないでしょうか?

+0

OSS-Securityメーリングリストの[Qualys Security Advisory - The Stack Clash](http://www.openwall.com/lists/oss-security/2017/06/19/1)を参照してください。それはいくつかのきちんとしたトリックを示し、ガードページをかなり害しています。彼らがそれを使っていくつのOSを驚かせたかは驚くべきことです。 Windowsが影響を受けるかどうか疑問に思う。 – jww

答えて

1

SEHを使用してEXCEPTION_ ACCESS_VIOLATION例外のみをキャッチすると、同じ問題が発生しますか?

だと思います。この問題を回避するには、IsBadReadPtrの呼び出しを開始する前に、あなたが知っているすべてのスレッドのスタック[s]を調べることがあります(スタックをプローブすることによって、スタック内のすべてのメモリページを意図的にタッチして、ページはあらかじめ割り当てられています)。

コンパイラは、呼び出される関数を最適化しませんか?

この関数がインライン展開されていない場合、コンパイラは通常の最適化を適用することが期待されます(関数の最適化は関数の呼び出し元の影響を受けません)。

+0

あなたが気にしているスレッドのスタックが、コミットされた値と予約された値を同じにしてCreateThreadを呼び出すことによって完全に割り当てられたことを確認できますか?また、画像スレッドのスタック設定を一致させるように設定します。しかし、ライブラリで作成されたスレッドではうまくいかないでしょう。 –