- ベストアンサー
フック関数を使って情報流出防止
例えばあるファイルやデータが送信される際に、どのファイルが送信されようとしているかを表示させ警告を出して、そこで通信を止めるプログラムを作ろうと思っています。これをうまく使えば、望まない情報流出を防ぐことが出来るものになります。 ですが、実際にプログラムにはどのように書いたらいいのかよくわかりません。vc++を使って開発しようとしているのですが、まだ使い初めでよく分かっていません。フック関数を使うことまでは分かったのですが、具体的にどのようにやったら良いのか分かりません。 http://ruffnex.oc.to/kenji/text/api_hook/ のサイトを参考にしています。SetWindowsHookExを使いopen関数をフックしたらどうか?という意見をもらったのですが、よく仕組みが分かっていません。データを送信するときは、いったん何かのファイルを開いて書き込んでから送信されるものなんでしょうか? この↑サイトのサンプルを参考にして作り上げることは可能でしょうか?また具体的にどのようにやったら出来るかお分かりの方いましたら教えて下さい。 まだプログラム初心者なもので、よく分かっていないことだらけで申し訳ありません。ちなみに開発環境はvc++2003、windowsXPです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>SetWindowsHookExを使いopen関数をフックしたらどうか? WinAPIではCreateFileまたはCreateFileExですね。 ただし、普通にファイルにアクセスしても検知されます。 結局のところネットワークを監視するしかないと思います。 ウイルスバスターについているようなファイアーウォール機能をきちんと設定すれば 外にでるパケットに関してもブロックする事が可能ですし、 WindowsXpSP2のファイアーウォール機能でも送受信の際 ブロックを解除するかどうかのダイアログが表示されると思います。 ただしそれがファイルの送信なのかどうなのかの判断がつきません。 ちなみにネットワークの監視をしたいなら TCPViewやEtherealがオープンソースなので参考になると思います。 TCPView・・・どのポートに接続しているか監視するソフトです。 Ethereal・・・生パケットのログを記録する事が出来ます。(ドライバレベルでパケットをひろいます) もしファイル送信のみ防止する機能をつけるなら パケットを解析して、ファイル送信なのかどうなのかを判断する必要があると思いますが ファイル送信のパケットなのかどうかの100%判断する事は不可能です。 それはウイルス対策ソフトがそのバイナリをウイルスかどうかの判断を100% の精度に出来ないのと同じことです。 もちろんFTPやネットワーク共有、あるいはWinny等、プロトコルを 限定すれば検知可能でしょうしそれだけでも十分な効力はあるでしょう。 >データを送信するときは、いったん何かのファイルを開いて書き込んでから送信されるものなんでしょうか? わざわざ他の一時ファイルを書き込んだりはしません。一度読み込んだものは そのままメモリから送信されるだけです。 >プログラム初心者なもので 一度他のPCにファイルを送信するプログラムを作ってみてはどうでしょう? それで基本的な事がわかると思います。 >サイトのサンプルを参考にして作り上げることは可能でしょうか? このサイトは非常に参考になりますが初心者向けのサイトではありません。 それにここだけを理解すれば作れるという単純な話でも無いです。 あくまで土台の知識です。
その他の回答 (1)
- dekopa-
- ベストアンサー率42% (161/378)
「ファイルを開く」という動作は殆どのソフトが該当してしまいます。 それが送信目的なのか、Wordで編集するためなのかは分かりません。 仮に「送信」だけを食い止めたいなら、むしろTCP/IPの通信を全て監視し、ファイルを送信できるありとあらゆるプロトコル(FTPやHTTP、SMTPやWebDAV、SMB etc..)を解析し、それがファイル送信を含んでいる場合のみシャットアウトする必要があります。 送信以外にも、ファイルのコピー、印刷(さらにその後のFAX)、USBメモリの利用やCD焼きソフトの利用など、情報を持ち出す手段はたくさんあります。 Windowsだけではなく、例えばUSBやCDからブートするLinux環境を起動し、ネットワークからファイルをコピーすれば貴方の作ったソフトは起動すらしません。 網羅的にあらゆる「外部への送信」「USBメモリ等の使用」を防御したければ、それ専用のソフトを購入するのが一番ですよ。 安価に「ありとあらゆるリスクを防ぐ」のは無理です。やればやるほどコストがかかるので、どこの会社でもどこまでやるかリスクと出費のバランスを考えて対策を取っているのです。 安価に防御する方法もあります。それは「全ての記録をとり、記録していることを社内に公開する」事です。 インターネット、メールはもとより、ファイルを開いたりコピーした記録まで、時間を含め全て記録している、と社内に知らしめるだけで、悪い事を考える人は減りますよ。
お礼
返信遅くなり申し訳ありません。 >「ファイルを開く」という動作は殆どのソフトが該当してしまいます。 >それが送信目的なのか、Wordで編集するためなのかは分かりません。 上記の質問に答えたとおり、とりあえずファイルを開いたら検知できるようにしたいと思っています…。 (ファイルを開いたら、その開いたプログラム名を列挙する感じ) サイトのサンプルのMessageBoxの部分をCreateFile用に書き換えたら出来るのではないかと思っています…。 親切な回答ありがとうございました。 確かに送信以外にも、印刷やUSBメモリの利用がありますね。 今回はそこまで大がかりなことはせず、ただ、送信しようとしたら 検知&警告するくらいのプログラムを考えています。 ちなみに会社で使用するわけではありません。 ですが、参考になりました。ありがとうございました! また質問させていただくかもしれませんが、その時はよろしくお願いします。
お礼
返信遅くなり申し訳ありません。 >>SetWindowsHookExを使いopen関数をフックしたらどうか? >WinAPIではCreateFileまたはCreateFileExですね。 >ただし、普通にファイルにアクセスしても検知されます。 調べてみたところ、open関数を呼び出すと、CreateFileが呼ばれるのですね。 とりあえずファイルを開いたら検知できるようにしたいと思っています…。 (ファイルを開いたら、その開いたプログラム名を列挙する感じ) サイトのサンプルのMessageBoxの部分をCreateFile用に書き換えたら出来るのではないかと思うのですが…。 ためになる回答ありがとうございます。 やはりネットワークを監視するしかないのですかね…。 Etherealは使ったことがあります。また考えてみます。 これから更に勉強してみたいと思います。ありがとうございました。