2012-01-06 8 views
1

私が定期的に使用しているサードパーティのライブラリは、いくつかのWindows API関数で改ざんされており、もっとも厄介なものはSetUnhandledExceptionFilterです。それは意外にも、自分のハンドラを完全に無駄にします(あなたが知らないのなら、なぜそれを試してみてください)。ホットパッチによるAPI機能の無効化(グローバルではありません)

私はこの愚かさを回避したいと思います。明らかに、5バイトのホットパッチプロローグをxor eax,eax ret 4(自分自身を呼び出した後)で上書きして、それ以上の呼び出しを無駄にすることがあります。合法的にパッチを当てた機能を呼び出すこともできます同時に実行されている

  1. その他のプログラム:

    は、この2つの問題があります。彼らはでないかもしれません。は完全にbraindamagedであり、何か役に立つかもしれません。共有ライブラリは共有であるため、プログラムの実行中に同じDLLを読み込んだり既にロードしている他のプログラムは、終了時にプログラムがその機能を復元するまでパッチの対象となります。

  2. SetUnhandledExceptionFilterは、決してアンロードされないkernel32.dllに住んでいます。これは、予期せぬ非例外的なプログラムの終了が発生した場合(つまり、ユーザーがTaskManagerでプロセスを終了させる)、パッチがマシンが再起動されるまで持続することを意味します。これは非常に不快な機能です。

このようなことを行い、同時にシステム全体の適切な機能を混乱させることはありませんか?

私はPAGE_EXECUTE_WRITECOPYはそれがその後PAGE_EXECUTE_READにリセット保護を必要とすべきではないとして、あまりにも魅力的です(パッチを適用する前に、PAGE_WRITECOPYではなくPAGE_WRITEに保護を設定することについて考えているが、MSDNにはこれが唯一のVistaのSP1、およびXPの機能の後にサポートされていると言います維持する必要がある)。

私の理解では、これは自分のプロセスに加えた変更の可視性を制限するはずです。

これは正当な前提ですか、私が多分考えていないかもしれない他の機能(DEPや特別な特権や他の干渉など)にも従っていますか?

答えて

3

だけreplace that IAT entrySetUnhandledExceptionFilterを指すサードパーティのライブラリで、これははるかに簡単で、サードパーティのライブラリのみにローカルです。

さらに、サードパーティのライブラリがあなたのアプリと共に配布するdll /バイナリの場合は、SetUnhandledExceptionFilterに電話をかけてNOPするだけで、簡単で安全です。私はそれがその後 PAGE_EXECUTE_READに保護をリセットする必要はありませんよう(PAGE_EXECUTE_WRITECOPYが があまりにも魅力的ですパッチを適用する前に、PAGE_WRITECOPYを保護ではなく、 PAGE_WRITEの設定について考えているが、MSDNが、これは後に にのみサポートされていると言う

Vista SP1、およびXPの機能を維持する必要があります)。

実は、PAGE_EXECUTE_READWRITEはあなたの最善の策ですが、あなたは、あなたや他の誰かが既にメモリ改ざんかどうかを確認する必要がない限り、その一般的に良いアイデアは、元の権限を復元します。

+0

IATエントリを置き換えることは良いアイデアのように聞こえる、ありがとう。 – Damon

関連する問題