http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+201108/11080004.txt
引き続き時間があるときにちょこちょことログを取得するソフトを作っています
フックしたいライブラリ関数がアプリ側で
class lib
{
private:
HINSTANCE m_instance;
typedef ...func();
...func* _func;
public:
lib()
{
m_instance = LoadLibrary();
if(m_instance)
_func = GetProcAddres(..
}
...Func(){ if(_func) _fucn() };
};
このようにアドレスを保存しそれを呼び出す形にしていた場合に
先にフックを仕掛ける側が起動していればLoadLibraryが改変されているため機能するの
ですが
仕掛けられる側が先に起動していた場合うまくフックがかけられないようです。
何かよい方法ありますでしょうか?
#多分今の実力では手が出せないのですが…
「IATを書き換える」で検索すると色々出てくるようです。
Microsoft社の研究所が公開しているMS Detoursタイプのフックを使えばできます。
APIの先頭数命令をフックルーチンへの分岐命令で置きかえる手法です。
フックルーチンが終了すると置き換えた元の数命令を実行するtrampoline
ルーチンを経由して元のAPIの次の命令に分岐する仕掛け。
■論文
http://research.microsoft.com/pubs/68568/huntusenixnt99.pdf
■MS DetuorsおよびDetours類似のライブラリ
Microsoft Detuors(商用有償 US$ 10,000)
http://research.microsoft.com/en-us/projects/detours/
MinHook - The Minimalistic x86/x64 API Hooking Library(無償)
http://www.codeproject.com/KB/winsdk/LibMinHook.aspx
Powerful x86/x64 Mini Hook-Engine(無償)
http://www.codeproject.com/KB/system/mini_hook_engine.aspx
回答ありがとうございます。
まず提示のHPで勉強してわからなかったりうまくいかなかったら
よろしくお願いします。