2011-06-28 7 views
2

まず、いくつかの背景:VCで書かれている(私自身のプロセス内でのみ)

私のソフトウェアは++に沿ってロードされますDLLのいくつかの大規模な第三者に依存しています私のアプリで。これらのlibsは、通常の動作中に浮動小数点例外を発生させることがよくありますが、これらの例外をマスクする浮動小数点制御ワードのデフォルト設定のため、ハードウェア例外として通知されないため、プログラムはこれらのためクラッシュしません。

は、今の問題は、 Zeallsoftスーパースクリーンキャプチャのようないくつかのサードパーティ製のプログラムは、ボーランドC++で書かれている、独自のDLLを注入するとき、彼らは浮動小数点例外と理由の私のアプリのクラッシュを有効にするには、FP制御ワードを設定することですそれ。

主な問題は、サードパーティのlibと、独自のDLLのを注入されたサードパーティ製のソフトウェアを使用してかもしれませんが、私はまだあるため、このような問題のクラッシュからの私のソフトウェアを保護したいです。私は考えることができる

ソリューションは、私のプロセスの内部で起こってのDLLをロードの通知を取得し、FP制御ワードは、DLLのロードが発生した後の値をデフォルトにリセットされていることを確認してくださいどのようにいくつかにあります。

私はそれを達成するための簡単で効果的な方法を探しています。私のプロセスでDllの負荷が通知される方法はありますか?私がしたいことを達成する他の方法はありますか?私は警戒したい唯一のことは、この方法が勝利2KとWinXPの上で動作し、より高い第二に使用される方法は、潜在的にアンチウイルス/スパイウェアスキャナのマルウェアヒューリスティックを引き起こすことができる性質のものではならないということです。

答えて

-1

It is the responsibility of the DLL to restore the FPU state.

あなたはFPUの状態に問題at the time of unhanded exceptio nと、reset the FPU stateを検出することができますが、DLLは、その後正常に動作しない場合があります(some people do rely on FPU exceptions、と彼らはそれを可能にする理由があります)。互換性のないdllがプロセスに注入されたことをユーザーに通知すると、予期しない動作が発生します。

また、プログラムファイルフォルダ(or the Windows Installer database)をスキャンして、既知の互換性の問題が存在しているユーザーに警告することができます。

+0

はい、私はDLLは、FPフラグの状態を復元する必要があることに同意するものとします。しかし、問題はBorland C++がデフォルトでこれらのFPフラグを有効にすることを知っていることであり、人々はそれらを必要としないときに無効にすることはしばしばありません。 – DarthCorder

+0

[ボーランドコンパイラと浮動小数点例外(http://www.virtualdub.org/blog/pivot/entry.php?id=53)。このようなDLLが無効になっているプロセスに注入されると、特に問題になります。 Exception Handlerがインストールされていますが、例外が発生した後にこの状況を処理するのは遅すぎます。私が試したことの1つは、LoadLibraryExをフックしてそこからFPフラグをリセットすることです。 – DarthCorder

2

ウィンドウDebugger APIでこれを行うことができます。具体的には、LOAD_DLL_DEBUG_EVENTデバッグイベントを監視します。アプリのロックにつながる可能性があるため、自分自身をデバッグすることは危険であることに注意してください。また、通常のデバッグはできません。

代替はLoadLibraryExLoadLibraryALoadLibraryWにプロセス全体Hot Patcha better paper on it)フックを行い、DLLのは、そこを通過するチェックです。

この主な問題は、あなたがより「黒魔術」を必要とするかもしれないプロセスの負荷の他に何(あなたが気にすることを)、前フック/モニターをインストールすることを確認する必要がある....

+0

返信いただきありがとうございます。私はIATパッチを適用してLoadLibraryコールをフックして問題を修正しましたが、マルウェア/ウィルススキャナのヒューリスティックを引き起こします。 – DarthCorder

関連する問題