2

2 つの FARPROC があり、ASM を使用して一方のアドレスを他方のアドレスに置き換えたいと考えています。

FARPROCとは何ですか? "[int (FAR WINAPI * FARPROC) () ] C では、FARPROC 宣言は、指定されていないパラメーター リストを持つコールバック関数を示します。ただし、C++ では、宣言内の空のパラメーター リストは、関数にパラメーターがないことを示します。この微妙な違いにより、不注意なコードが破損する可能性があります。以下は、この状況を処理する 1 つの方法です:"

それがカバーされたので、これは私のコードです:

  HMODULE h = LoadLibrary("myDLL.dll");
  FARPROC p = GetProcAddress(h, "_GetHelloMessage@0");

  if(!p) MessageBox(hwnd, "injected, but function not found", "Loader", NULL);

  HMODULE dllHmodule = GetModuleHandle("InjectFunctions.dll");
  FARPROC injproc = GetProcAddress(dllHmodule, "_GetHelloMessage@0");

  if(!injproc) MessageBox(hwnd, "injproc is null", "Loader", NULL);

  __asm{
        mov eax, p
        ADD injproc [EAX],8
    }

私の質問は、この DLL をロードしたプログラムが p を呼び出すたびに、代わりに injproc を呼び出すようにする方法です。

4

1 に答える 1

1

外部DLLで参照される各関数は、実行可能ファイルのヘッダー領域にあるインポートアドレステーブルのエントリを取得します。そのエントリの一部は、関数のアドレスです。それはあなたがどこかに電話をかけるためにあなたがパッチを当てるものです。オープンインターネットでこれを行う方法については、たくさんの例があるはずですが、私はたまたま便利なリンクを持っていません。

自分でこれを実行する場合は、msdnからPortable Executable仕様をダウンロードして、これらのヘッダーの形式を確認してください。

于 2013-03-07T17:49:05.183 に答える