6

x86-DLL をフックする x64 プロセスに挿入された x64-DLL は、C++ および EasyHook を使用すると失敗します。Loader、InjectionLibrary、および InjectionTarget (両方のバージョンで利用可能であり、両方をフックする必要があります) が x86 の場合に機能します。エクスポートされたプロシージャ (GetProcAddress 自体) のアドレスを取得することは、x64 では問題になりません。InjectionTarget には、x64 でも依存関係として HookTarget(Kernel32.dll) があります。LhInstallHook(...) は、「ターゲット エントリ ポイントにサポートされていない命令が含まれている」場合に発生するとソース コメントが示す STATUS_NOT_SUPPORTED を返します。

ソースは x86 ビルドに適しているため、追加しないことにしました。

私は少し図を引っ掻いた ここに画像の説明を入力

4

1 に答える 1

6

64 ビット プロセスで 32 ビット DLL を使用することはできません。実際、これは一般化されます。x86 コードと x64 コードを混在させることはできません。これは x86-64 の基本であり、それに対してできることは何もありません。Windows コントロール コンソールでは、64 ビット プロセスと 32 ビット プロセスを作成し、IPC を使用して 32 ビット プロセスを制御し、すべての 32 ビット シェル拡張機能をロードして処理します。勇敢な人や絶望的な人なら、似たようなことを試すことができます。

編集:ちょっと待って、ちょっと待って。x86 モードですべてが正常に動作する場合の基本的なプロセスについて、もう少し詳しく説明していただけますか? たとえば、X は Y から関数をロードします。私は Z を実行しています。なぜなら、私はあなたが何をしているのか理解していないように見えるからです。

インジェクション ターゲットとインジェクションされた DLL があり、そこからサード パーティの x86 専用 DLL のプロシージャを呼び出そうとしています。そのため、呼び出しの通常の流れは、InjectionTarget -> InjectionLibrary -> HookTarget -> ExportedProcedure になります。HookTarget は x86 のみであり、それを変更することはできないため、これは機能しません。そのため、x64 バージョンの InjectionTarget 用に x64 用の InjectionLibrary を再コンパイルすると、x64 InjectionLibrary がx86 フック ターゲット。

この問題の唯一の解決策は、x86 プロセスを作成し、プロセス間通信を使用して、呼び出したい HookTarget 内のプロシージャを呼び出すようにすることです。x64 用に HookTarget を再コンパイルできない場合は、これが唯一の方法です。

于 2011-06-24T14:51:16.430 に答える