C、C++言語(Detours)についての質問
Detoursを用いて、下記のWebサイト通りに試したのですが、エラーが出てAPIフックができません。(前準備までは下記の通りで成功しました)
http://asd.if.land.to/code/apihook7.html
環境は、Windows7 proffesional 32bit版です。Visual Studio 2008を使っております。
プロジェクトはWin32コンソールアプリケーションで作成しており、アプリケーションの種類は、Windows アプリケーションを選択しております。
プロジェクトのディレクトリに登録したのは、
$(ProgramFiles)\Microsoft Research\Detours Express 3.0\include
$(ProgramFiles)\Microsoft Research\Detours Express 3.0\lib.X86
$(ProgramFiles)\Microsoft Research\Detours Express 3.0\bin.X86
Webに記載されている通りにソースコードを書いてコンパイルするとこのようなエラーがでました。
1>test.obj : error LNK2019: 未解決の外部シンボル _DetourTransactionCommit@0 が関数 _wWinMain@16 で参照されました。
1>test.obj : error LNK2019: 未解決の外部シンボル _DetourAttach@8 が関数 _wWinMain@16 で参照されました。
1>test.obj : error LNK2019: 未解決の外部シンボル _DetourUpdateThread@4 が関数 _wWinMain@16 で参照されました。
1>test.obj : error LNK2019: 未解決の外部シンボル _DetourTransactionBegin@0 が関数 _wWinMain@16 で参照されました。
1> test.obj : error LNK2019: 未解決の外部シンボル _DetourRestoreAfterWith@0 が関数 _wWinMain@16 で参照されました。
Detoursを用いたAPIフックの勉強中のためご教授願います。このサイトを参考にして、APIフックできた方がいましたら書き込みよろしくお願いします。
ソースコード test.cpp
#include <windows.h>
#include <tchar.h>
#include <detours.h>
// MessageBoxA
INT ( WINAPI *RealMessageBoxA )( HWND, LPCSTR, LPCSTR, UINT ) = MessageBoxA;
INT WINAPI DetoursMessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType )
{
return RealMessageBoxA( hWnd, lpText, "hook", uType );
}
// GetModuleFileNameA
DWORD ( WINAPI *RealGetModuleFileNameA )( HMODULE, LPSTR, DWORD ) = GetModuleFileNameA;
DWORD WINAPI DetoursGetModuleFileNameA( HMODULE hModule, LPSTR lpFilename, DWORD nSize )
{
//RealGetModuleFileNameA( hModule, lpFilename, nSize );
::lstrcpyA( lpFilename, "hook" );
return 4; // 文字数を返す
}
INT APIENTRY _tWinMain( HINSTANCE, HINSTANCE, LPTSTR, INT )
{
// フック
::DetourRestoreAfterWith();
if ( ::DetourTransactionBegin() != NO_ERROR )
return 0;
if ( ::DetourUpdateThread( GetCurrentThread() ) != NO_ERROR )
return 0;
::DetourAttach( (PVOID*)&RealMessageBoxA, DetoursMessageBoxA );
::DetourAttach( (PVOID*)&RealGetModuleFileNameA, DetoursGetModuleFileNameA );
::DetourTransactionCommit();
// テスト
CHAR szPath[ MAX_PATH + 1 ];
::GetModuleFileNameA( NULL, szPath, MAX_PATH );
::MessageBoxA( NULL, szPath, "exeのパスを表示", MB_OK );
return 1;
}
それでは、よろしくお願いします。