2

アプリケーションの作業ディレクトリに存在するものとは異なるバージョンの DLL をロードしたいと考えています。そのためには、LoadLibrary 呼び出しをフックして、アプリケーションが DLL をロードする呼び出しを行ったときに、その DLL の新しいバージョンに透過的に置き換えることができるようにする必要があります。NCodeHook を使用してみましたが、DLL に次のコードがあり、NInjectLib を使用してアプリケーションに挿入しましたが、kernel32.dll のロード中にクラッシュします。これが呼び出しを挿入する正しい方法であるか、または他の代替手段があるかどうか、誰か教えてください。

        // CodeHook.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <NCodeHookInstantiation.h>
#include "CodeHook.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

typedef HMODULE (WINAPI *LoadLibraryFPtr)(LPCTSTR dllName);

#pragma data_seg("SHARED")
LoadLibraryFPtr origFunc = NULL;
#pragma data_seg()          

#pragma comment(linker, "/section:SHARED,RWS")


HMODULE WINAPI LoadLibraryHook(LPCTSTR dllName)
  {
   if (origFunc != NULL) 
   {
  return origFunc(dllName);
   }
  }



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{
    return TRUE;
}

CODEHOOK_API void Initialize (void) 
{ 
 NCodeHookIA32 nch;
 origFunc = nch.createHookByName("kernel32.dll", "LoadLibrary", LoadLibraryHook);
}

#ifdef _MANAGED
#pragma managed(pop)
#endif
4

3 に答える 3

4

NCodeHook ライブラリについては知りませんが、知っておくべき重要なことの 1 つは、LoadLibrary 関数には実際には と の 2 つのバージョンがあるということLoadLibraryA(LPCSTR)ですLoadLibraryW(LPCWSTR)。正しいものをフックし、適切な関数定義を使用していることを確認してください。LoadLibraryExA/LoadLibraryExW をフックする必要がある場合もあります

Detoursは、API フック用のより広く知られているライブラリです。その他のフッキング テクニックについては、この記事も参照してください。

于 2009-11-05T16:58:00.697 に答える
-1

API フックには多くの落とし穴があります。NCodeHook の実装に関する詳細はわかりませんが、API フック コードが書き込み不可のページを適切に処理しない場合、問題が発生する可能性があります。ライブラリが呼び出さVirtualProtectれ、OS がコピー オン ライトを適切に処理すると想定する人もいるかもしれませんが、それを言うのは困難です。

これがあなたの問題に対する最良の解決策ではないかもしれないというコメントに同意します。API フックはアプリケーション バイナリ インターフェースに依存しており、準ドキュメント化されている程度です。本番環境での使用を目的とした商用アプリにはお勧めしません。

厳密な名前により、どの DLL を読み込む必要があるかについてのあいまいさがなくなるため、サイド バイ サイド アセンブリは間違いなく役に立ちます。または、DLL とフラグLoadLibraryExへの絶対パスを使用することを検討してください。LOAD_WITH_ALTERED_SEARCH_PATH

于 2009-12-10T05:34:34.037 に答える