1

C++ DLL のソース コードがあります。この DLL はアプリケーションの一部です。別の DLL によってメモリにロードされた関数をフックして、フックされた関数が元の関数ではなく他のすべての DLL によって呼び出されるようにします。このコードをコードに入れました:

#include <windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")

//Function prototype
int (__stdcall* OriginalFunction)(); 

//Our hook function
int FunctionHook()
{
    //Return the real function
    return OriginalFunction(); 
}

//On attach set the hooks
OriginalFunction = (int (__stdcall*)())DetourFunction((PBYTE)0x0100344C, (PBYTE)FunctionHook);

問題は、1 つの DLL でオフセットを検索し、このオフセットで関数にパッチを適用するのは間違っているのではないでしょうか (別の DLL にいて、すべての DLL の関数をフックしたいので、より複雑だと思います)。ところで、IDA PRO で標準 (fex. 0x0100344C) オフセットを取得する方法を知っている人はいますか?

4

1 に答える 1

0

Windows プラットフォームのフック システムである Microsoft の迂回路を使用しようとしているようです。迂回路は「トランプラインフック」を使用。簡単に言えば、関数の先頭のいくつかの ASM 命令を「書き換え」、実際の呼び出しを特定の関数にリダイレクトしようとします。迂回路は、これらの詳細を処理するのに役立ちます。しかし、回り道に関するコードは見当たらないので、回り道の基本的な使用法に関するドキュメントを学ぶ必要があると思います。

あなたの質問のために:
OriginalFunction特定のアドレスへの変数ポイントです。この変数を書き換えても、実際の呼び出しには影響しません。プログラムは元のアドレスを使用して呼び出すため、内部プログラムではなく変数を変更するだけです。
Windows NT のプログラムは実メモリ アドレスではなく仮想アドレスを使用しているため、メモリをフック関数に書き換えると、この法線は現在のプロセスに影響を与えます。

于 2011-07-03T14:03:35.130 に答える