プロセスの起動を随時監視する方法

[戻る]
2009/10/13(火) 18:37:06
ユーザが、GUI上または、コマンドプロンプトからプロセスを起動した場合、
起動処理を一旦止めて、自分のプログラム側でユーザ選択のファイルをチェック(簡単
なデータベース照合)
問題がある場合は、起動を取り消す必要があります。

この場合、CreateProcessなどのAPI Hookのみで実現することは可能でしょうか?
ドライバレベルの作成が必要になるのでしょうか?
また、文献などをご存知の方がいましたら、教えていただけたら幸いです。



詳細は以下のとおりなります。

1.プロセスの起動        :ユーザ操作
2.プロセスの起動を止める :※調査中
3.ファイルのパスを取得   :※調査中
4.ファイルのチェック
    ドライバ作成が必要な場合は、ユーザモード側でチェックを行います
5.使用規則に引っかかるアプリの場合は、起動を中止
 問題なければ、通常通り実行ファイルの起動

簡単に言うとウィルスソフトの常駐監視の機能に近いものだと思います。


http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200803/08030010.txt
過去ログを検索したところ、上記の質問が近いと思いましたが
なにぶん、ドライバ作成をしたことがないので、ただいま勉強をかねて参考サイトを
拝見しているところです。


開発環境 : Visual Studio 2008 C++

ZCH 2009/10/15(木) 19:24:41
http://keicode.com/windows/win08.php
の方法で、該当する場合はプロセスを落とせば
実現できそうな気がします。

KJ 2009/10/17(土) 12:11:09
WMIで__InstanceCreationEventを処理すればいいんでない?
WMIはC++からだと面倒だけど。

てきとうにぐぐった。

・WMI によるプロセスの監視
http://lightbox.matrix.jp/ginpro/patio.cgi?mode=view&no=261&w=700

aetos 2009/10/19(月) 07:56:34
AppInit_DLLs は、リンク先にもありますが、
> user32.dll がロードするので user32.dll を使わない EXE にはロードされないこと
になります。
ということで、大抵のアプリには有効ですが、すべてのアプリに効くわけではありませ
ん。

AppInit_DLLs にせよ WMI にせよ、アプリの起動を検知してログに残す程度はできます
が、一旦停止して再開というのはできません。

2009/10/21(水) 15:26:38
返信遅れまして、申し訳ありませんm(_ _)m

>>ZCH さん
ありがとうございます。簡単に実現できたのでビックリしました。
ただ、基本的にuser32.dllを使用していないモジュールには適用できないので、
今の考えでは少し実現が不可能な感じです。


自分の方でもいろいろと調べてみたところ、
Win32APIのフックレベルでは、実現が難しそうです。
現状は、ドライバでネイティブAPIのNtCreateProcess、ZwCreateProcessあたりにフック
をかけ、なんとかアプリ起動を停止、自分のアプリ側で操作を持ってくるところまでは
成功しましたが、微妙に安定せず。すぐにブルースクリーンです。
も少し、調査を続行します。

日本語のドキュメントがないのが、かなり辛いです・・・・

2009/10/21(水) 15:44:53
連続投稿失礼します。

現状、海外のサイトのドキュメントを参考に調べていたところ。
現状のOSがXP環境の作成、動作確認を行ったところ、NtCreateProcess、
ZwCreateProcessに対してフックをかけることで、他のアプリの起動操作は実現可能のよ
うです。(2000、XP、2003)

ただ、Vista環境では、動作しないみたいです。
他のドキュメントでは、代わりにNtCreateUserProcess、ZwCreateUserProcessをフック
することで可能ということを見つけました。

Vista環境の動作確認が今のところできませんが、この方法で可能かご存知の方がいまし
たら教えていただけないでしょうか?

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