私が定期的に使用しているサードパーティのライブラリは、いくつかのWindows API関数で改ざんされており、もっとも厄介なものはSetUnhandledExceptionFilter
です。それは意外にも、自分のハンドラを完全に無駄にします(あなたが知らないのなら、なぜそれを試してみてください)。ホットパッチによるAPI機能の無効化(グローバルではありません)
私はこの愚かさを回避したいと思います。明らかに、5バイトのホットパッチプロローグをxor eax,eax ret 4
(自分自身を呼び出した後)で上書きして、それ以上の呼び出しを無駄にすることがあります。合法的にパッチを当てた機能を呼び出すこともできます同時に実行されている
- その他のプログラム:
は、この2つの問題があります。彼らはでないかもしれません。は完全にbraindamagedであり、何か役に立つかもしれません。共有ライブラリは共有であるため、プログラムの実行中に同じDLLを読み込んだり既にロードしている他のプログラムは、終了時にプログラムがその機能を復元するまでパッチの対象となります。
SetUnhandledExceptionFilter
は、決してアンロードされないkernel32.dll
に住んでいます。これは、予期せぬ非例外的なプログラムの終了が発生した場合(つまり、ユーザーがTaskManagerでプロセスを終了させる)、パッチがマシンが再起動されるまで持続することを意味します。これは非常に不快な機能です。
このようなことを行い、同時にシステム全体の適切な機能を混乱させることはありませんか?
私はPAGE_EXECUTE_WRITECOPY
はそれがその後PAGE_EXECUTE_READ
にリセット保護を必要とすべきではないとして、あまりにも魅力的です(パッチを適用する前に、PAGE_WRITECOPY
ではなくPAGE_WRITE
に保護を設定することについて考えているが、MSDNにはこれが唯一のVistaのSP1、およびXPの機能の後にサポートされていると言います維持する必要がある)。
私の理解では、これは自分のプロセスに加えた変更の可視性を制限するはずです。
これは正当な前提ですか、私が多分考えていないかもしれない他の機能(DEPや特別な特権や他の干渉など)にも従っていますか?
IATエントリを置き換えることは良いアイデアのように聞こえる、ありがとう。 – Damon