VistaでWinsock2(ws2_32.dll)をフックする

XPの時はws2_32.dllをローカルディレクトリに置けば標準のws2_32.dllをラップしてごにょごにょできたのだが、Vistaだとどうもうまく動かない(Process Explorerで確認してもローカルのws2_32.dllがロードされていない)。ググってみたらやはり同じような症状がでている例多数。


正当な解決方法?としてはmanifestファイルを作ることかもしれないが署名とかめんどいことを言ってるのでとりあえずスルー


そこで、以前面白そうなのでダウンロードしたけどそのまま放置されていたDetoursを再び引っ張り出して遊んでみることにした。
これはMicrosoft謹製のDLLインジェクションライブラリ。
何で放置されてたかというと、実はこれ、ソースコードしかインストールしてくれないので、バイナリは一切入ってない。ダウンロードして展開したはいいが、「コンパイルめどい」と思ってそのまま放置されてた次第。


今回は必要に駆られたのでしょうがなくビルドしてみる。
DetourCreateProcessWithDllという関数を使うと、任意のDLLをインジェクトした状態で任意のプロセスを起動できる。DetourCreateProcessWithDllを使うサンプルプログラムは WithDll というもの。これもソースコードしかないのでプロジェクトを作ってビルドしないといけない。


(1)まず本体、detours.dll をビルドする。
(2)syelog.dll をビルドする。
(3)syelogd.exe をビルドする。(コンソールアプリケーション)
(4)WithDll.exe をビルドする。(コンソールアプリケーション)
(5)tracetcp.dll をビルドする。


defファイルも添付されてないので必要なエクスポート関数を適当に詰め込む。
detours.dllは、Detoursの本体。syelog.dllは汎用のロギングライブラリ。syelogd.exeはsyelog.dllのログをコンソールにリアルタイムで吐き出すデーモン。WithDll.exeは指定したDLLをインジェクトした状態で指定したEXEを起動するランチャー。tracetcp.dllはサンプルで入っているWinSock APIをトレースするサンプル。


これで準備完了。
実行してみる。

withdll /d:tracetcp.dll "c:\program files\Internet Explorer\iexplore.exe"

DetoursのページにはVistaの言及はなかったが、Vistaでも問題なく動作するようだ。
ちなみに、コマンドプロンプトをもう1つ立ち上げて、syelogd.exe を起動しておくと、こちらでトレース出力を受け取ってコンソールで見ることができる。


tracetcp.dllはws2_32.dllのラッパーを作るにはちょうど良いスケルトンになってるのでそのまま改造して使える。