1

簡単に言えば、問題はこれです。カーネルモードのWindowsドライバーを作成しています。このドライバーは、カーネルモードのDLL(または他の実行可能モジュール)が読み込まれると通知を受け取ります。状況によっては、DLLエントリポイントルーチンをインターセプトする必要があります。つまり、ルーチンが最初に呼び出されるようにオーバーライドしてから、元のエントリポイントに制御を渡すことができます。

32ビット(正確にはx86)では、それを行うのに問題はありませんでした。モジュールのベースマッピングアドレスを取得します。これは、実際には標準のPEヘッダー(Windows実行可能ファイルで使用される)で始まります。DLLエントリポイントのRVA(イメージベースに相対的なアドレス)があります。ルーチンのアドレスからモジュールのベースアドレスを引いたもので上書きします。出来上がり!

現在、64ビットでは状況がより複雑になっています。問題は、RVAがまだ32ビット整数であるということです。このようなRVAは、イメージのベースアドレスから始まり、4GBのオフセットで終わるアドレス範囲をカバーします。同じ実行可能モジュール内のシンボルを参照するのに問題はありませんが(4GBのサイズを超えないと仮定)、これにより、モジュール間のインターセプトに問題が発生します。当然、私の実行可能モジュールとフックしようとしているモジュールは、同じ4GBの範囲に入る必要はないので、問題があります。

一時的に、元のルーチンのプロローグコードを無条件でコードにオーバーライドすることでこれを解決しましたjmp。これは、64ビットプラットフォームでは12バイトかかります。次に、ルーチンから元のコードを呼び出すために、オーバーライドされた12バイトを復元します(つまり、上書きする前にそれらを保存します)。

これまでのところ、問題はありません。しかし、今は状況が変化しており、エントリポイントルーチンへのマルチスレッドアクセスをサポートする必要があります(理由は聞かないでください。これは、いわゆる「ユーザースペース」にロードされたマルチセッションDLLに関連しています。各ターミナルセッションに対して)。

解決策の1つはグローバルロックを使用することですが、これは避けたいと思います。

いわゆる「トランポリン機能」については知っていますが、これも避けたいと思います。これを行うには、命令境界と可能な分岐を適切に識別するために、関数プロローグコードの実行時デコードが必要です。

最近、別のアイデアを考えました。mov RAX addr元のDLLの「不要な」部分(少なくとも12バイトの長さ( +のサイズ))が見つかった場合はどうなりますかjmp RAXjmpそうすれば、この部分は私の手に上書きされる可能性があります。次に、エントリポイントRVAをこの部分に設定できます。

これが機能するために必要なのは、上書きできる適切な部分だけです。PEヘッダーには、何十年も使用されなくなった履歴フィールドが多数含まれているため、このような可能性があると思います。

このアイデアは試す価値がありますか、それともこれはよく知られた手法ですか?アンディ他の提案?

前もって感謝します。

4

1 に答える 1

2

いくつかのオプションがあります。残念ながら、これらの3つから2つしか選択できません。100%ソリッド。実装が簡単。安いです。

.TEXTセクションの最後に、未使用のスペースが見つかる可能性が非常に高くなります。これは、Windowsが画像セクションを4kのチャンクでメモリにマップし、通常、.textセクションが正確な乗算ではないためです。

実装が簡単なもう1つの方法は、PEヘッダーを使用することです。オーバーライドするのに非常に安全な領域は、DOSスタブです。問題は、PEヘッダーがエントリルーチンと同じセクションにあるという保証がないことです(ただし、Microsoftリンカは同じセクションに配置しますが、GNUなどについてはわかりません)。

もう1つの簡単ですが、システムDLLでのみ機能するのは、「ホットパッチ」が実行していることを実行し、各関数の前に「nop」に設定された15バイトと「movedi、edi」命令を再利用することです。これは、ホットパッチをサポートするためにWindowsでリリースされたすべてのDLLに当てはまります。

信頼できるが難しいオプションは、@DavidHeffemanの提案を実行することです。この手法は「ランディング関数」と呼ばれ、最初の12バイトをランディング関数にコピーします。ランディング関数は元の関数にジャンプします。

簡単で信頼性の高いオプションは、MSDetourを使用することです。Microsoft Detourは、Microsoft Researchの製品であり、まさにそれを実行し、うまく機能し、サポートされており、(他のものと一緒に)ポップする可能性のある多数のコーナーケースや競合状態を処理し、x86バージョンがオープンしています。ソース。欠点は、商用利用が非常に高価であるということです-前回チェックしたときは10kでした。

于 2012-11-02T09:34:31.000 に答える