目次
Microsoft Detoursとは
マイクロソフトが公開してる、アプリケーションのWinAPI呼び出しや、関数呼び出しをフックして任意の関数に置き換えるためのライブラリです。
古いアプリケーションの場合に、開発者が居ない場合や、ソースコードがない場合の利用を想定しているようです。
32ビット版のExpressは無料で公開されていますが、64ビット版は有料で高価なものとなっています。
今回はExpress版を利用してみます。
前提
- Windows 10
- Microsft Visual Studio 2015
- x86
Detoursのダウンロード
下記ページのDownload
から入手が可能です。
Detours Download
https://www.microsoft.com/en-us/download/details.aspx?id=52586
Detoursのインストール
ダウンロードしたDetoursExpress30.msi
を実行して、ガイド通りに進みます。設定値の変更は不要です。
Detoursをビルドする前の準備
インストールが完了した後に、Detoursのビルドを実行する必要があります。
ここでnmake
を使ってビルドするのですが、Makefileを修正しなければエラーがでて異常終了してしまいます。
C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\src>nmake
Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation. All rights reserved.
cl /W4 /WX /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=32 /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fd..\lib.X86\detours.pdb /Foobj.X86\detours.obj /c .\detours.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
detours.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(3190): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
.\detours.cpp(156): warning C4456: 'pbNew' を宣言すると、以前のローカル宣言が隠蔽されます
.\detours.cpp(156): note: 移行をシンプルにするために、ビルドに使用した警告なしのコンパイラのバージョンの /Wv:18 フラグを一時的に使用することをお勧めします
.\detours.cpp(147): note: 'pbNew' の宣言を確認してください
.\detours.cpp(163): warning C4456: 'pbNew' を宣言すると、以前のローカル宣言が隠蔽されます
.\detours.cpp(163): note: 移行をシンプルにするために、ビルドに使用した警告なしのコンパイラのバージョンの /Wv:18 フラグを一時的に使用することをお勧めします
.\detours.cpp(147): note: 'pbNew' の宣言を確認してください
.\detours.cpp(1263): warning C4456: 'o' を宣言すると、以前のローカル宣言が隠蔽されます
.\detours.cpp(1263): note: 移行をシンプルにするために、ビルドに使用した警告なしのコンパイラのバージョンの /Wv:18 フラグを 一時的に使用することをお勧めします
.\detours.cpp(1112): note: 'o' の宣言を確認してください
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.
Makefileの修正
C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\src\Makefile
の14行目
CFLAGS=/W4 /WX /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=$(DETOURS_BITS)
この部分を以下のように書き換えます。
CFLAGS=/W3 /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=$(DETOURS_BITS)
これでMakefile
の修正は完了です。
修正済みのDetoursをGithubにて公開しているので、詳しくはそちらを参照してください。
Microsoft Detours - Github
Detoursのビルド
スタートからVisual Studio 2015
のVS2015 x86 Native Tools コマンドプロンプト
を起動します。そして、以下のコマンドを実行します。
cd C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\src
nmake
C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\src>nmake
Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation. All rights reserved.
cl /W3 /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=32 /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fd..\lib.X86\detours.pdb /Foobj.X86\detours.obj /c .\detours.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
detours.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(3190): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
cl /W3 /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=32 /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fd..\lib.X86\detours.pdb /Foobj.X86\modules.obj /c .\modules.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
modules.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(3190): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
cl /W3 /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=32 /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fd..\lib.X86\detours.pdb /Foobj.X86\disasm.obj /c .\disasm.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
disasm.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(3190): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
cl /W3 /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=32 /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fd..\lib.X86\detours.pdb /Foobj.X86\image.obj /c .\image.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
image.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(3190): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
cl /W3 /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=32 /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fd..\lib.X86\detours.pdb /Foobj.X86\creatwth.obj /c .\creatwth.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
creatwth.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(1544): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
C:\Program Files (x86)\Windows Kits\8.1\include\um\dbghelp.h(3190): warning C4091: 'typedef ': 変数が何も宣言されていない ときは、'' の左辺を無視します。
lib /nologo /out:..\lib.X86\detours.lib obj.X86\detours.obj obj.X86\modules.obj obj.X86\disasm.obj obj.X86\image.obj obj.X86\creatwth.obj
C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\src>
最後の行がlib /nologo /out:..\lib.X86\detours.lib obj.X86\detours.obj ...
となればビルド完了です。
おわりに
以上で、Detoursの利用に必要なファイルのビルドは完了です。次回は、Detoursの使い方について書いてみたいと思います。