他のプロセスのファイル作成、書き込みを監視する方法(ApiHookで可能か)

[戻る]
西田 2009/08/13(木) 13:18:16
他のプロセスがファイルの作成、ファイルの変更を行ったときに、それを監視するプロ
グラムを作成する必要があります。
監視対象は全てのディレクトリになります。
主な概要としては、ユーザがダウンロードや、インストール作業をおこなった場合(ロー
カルにファイルを作成した場合)に、
プログラム側で、作成(変更)されたファイルのパスを取得して、ファイルの中身のチェ
ックを行います。
(アンチウイルスソフトの常時監視機能に近いと思います)
チェック自体はファイル作成後なので、パスを取得する以外は既存のApiの処理を変更す
ることはありません。

このファイル作成、書き込みの監視方法についてApiHookで実現可能かを考えています。
できるだけユーザモード側だけで実現したく、ドライバレベルの作成は避けたいと思っ
ています。

主な質問としては2点で、
・実際に実現可能か?
 ApiHookで、CreateFile、WriteFile、FlushFileBuffers、をフックして他のプロセス
が操作したファイル情報、ハンドルを取得できるか?
・ハンドルを取得できた場合、そのハンドルから、ファイルパスを逆算することは可能
か?

ApiHookの知識がまだ乏しく、可能であれば、まず他のプロセスが操作したファイルのパ
スを取得するとこから勉強しようと思います。

開発環境は、WindowsXP、VisualStudio2008になります。
長文でも申し訳ありませんが、ご指導のほどよろしくお願いいたします。

aetos 2009/08/13(木) 14:41:07
API フックができれば監視は可能だと思います。
ただし、セキュリティの問題で API フックができないプロセスもあります。

ファイルハンドルからファイル名を取得するのは…Vista 以降なら 
GetFileInformationByHandleEx でできるかも。
XP で Windows API を使う方法ではたぶん無理でしょう。

また、ファイルに書き込む API は ReadFile と WriteFile だけではありません。
最終的にそれらを呼びだす関数は多いでしょうが、そうでないものもあるでしょう。
ファイルマッピングオブジェクト経由とか、ReadFileEx、WriteFileEx、
ReadFileScatter、WriteFileGather、他いろいろ。

西田 2009/08/13(木) 19:58:50
>>aetos さん

返信ありがとうございます。
取りこぼしなくファイルパスを取得するのは、ApiHookでは難しそうですか、
何か簡単な方法があればいいのですが・・。
別方向からフィルタドライバで実現できないかを調べていますが、
日本語のドキュメントが少ない上に、敷居がめちゃくちゃ高くなりますよね(^^;

aetos 2009/08/14(金) 09:55:30
ドライバ関係の日本語の本は結構出てますよ。
ただ、敷居が高いのは事実ですね。
ドライバ自体、開発に間違うとブルースクリーンが出たり、ファイルシステムドライバ
の場合はディスクを壊したりする可能性もあるので、専用のマシンが欲しいですね。
最近は仮想マシンがあるのでマシでしょうか。

ZCH 2009/08/16(日) 00:03:25
カーネルモードでやるのが理想だと思いますが、
私はやったことありませんので、
これ以上コメントできません、申し訳ありません。

その昔FileMon、レジストリならRegMonというソフトがオープンソースで
西田さんのやりたいことをまさに実現していたのですが、
いつからかソースが無くなった記憶があります。
古いFileMonを探してみてはいかがでしょうか。

aetos 2009/08/17(月) 10:14:35
FileMon、RegMon もドライバ使ってます。念のため。

ISLe 2009/08/18(火) 23:04:52
#.NET(VB.NET,C#)だとファイルシステムを監視する標準コンポーネントがあるんですけ
どね。

aetos 2009/08/18(火) 23:55:21
C++ でも監視 API はありますが、ディスク上の全ファイルとなると無理ですね。

古いスレッドには追加発言できません。