Hookライブラリ「Detours」のインストールとビルド方法

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

https://github.com/gazf/microsoft-detours

Detoursのビルド

スタートからVisual Studio 2015VS2015 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の使い方について書いてみたいと思います。