タイトルに書いた通りではあるのですが、セキュリティ系のソフトを作ってみたくなりました。
実用性は考えていなのですが、市販のウィルス対策ソフト等がどのような仕組みになっているのか少しでも理解できれば良いと
考えています。
まず、ウィルススキャンソフトの方から作ってみようかと思っています。
そこで、まずつけるべき機能として考えているのは
1不審な動作をしているプログラムを見つけたら警告する。
2事前にウイルスとして登録したプログラムが動作または、存在しているのを発見したら警告or削除する
3ファイルを指定すると、そのファイルがウイルスであるかどうかを確認する
をできるようにしたいです。
1まず、他のプログラムの動作の状態を取得する必要があるのだろうと思うのですが、その方法が分かりません。
2発見するだけならば、ファイル名あるいは、ファイルの中身を事前に登録したデータと比較すれば可能かと思うのですが、
動作しているプログラムの場合はどのように発見して、また、終了させたら良いのか分かりません。(1と同じようなことをする必要があると思ってます)
3これは事前に定義したデータと比較すればできるだろうと考えています。
と、ここまで書いておきながら、自分にはまったくできなそうに感じられるのですが、
どうにか、こうにか少しでも形にできないかと考えています。
そこで、聞きたいのですが、
・上記1~3の考え方で問題ありませんか?
・ウイルス対策ソフトの作り方や仕組みについて参考になるHpはないでしょうか?
長々と抽象的で分かりずらい質問になってしまいましたが、よろしくお願いします。
開発環境
コンパイラ:vc++2008
OS:winodws XP
目的の実行環境はwindowsXp,vista,(7)
セキュリティソフトの作成
Re: セキュリティソフトの作成
自分がやってみようと思ったら、以下のように考えると思います。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
此処から先は自分の考えであり実際のアンチウイルスソフトの
実装とは全く関係がありません。ご注意ください。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
>1の他のプログラムの動作の状態を取得する方法について。
「不審な動作」というものが例えば、
・「シェルの起動」
・「リッスンを開始する」
についてだとします。
まず、フィルタドライバとして動作する方法。
CreateProcess系やsystem()が呼ばれたら引数を確認し
explorer.exeやcmd.exeを起動したら
メッセージボックスをだし、ユーザーに確認を取る。
といった流れでしょうか・・・?
「リッスンを開始する」
のほうもフィルタドライバを使って処理を横取りしてやれば
できそうですが…
次にAPIフックやDLLインジェクションを用いる方法。
アプリケーションだけ挙動を監視(というか制限?)したければ
APIフックを仕掛けるか、DLLインジェクションをして
CreateProcess系やaccept()をラップしたニセDLLを読ませてそのなかで
引数を確認し、シェル(explorer.exeやcmd.exe)だったらメッセージボックス
をだしてユーザーに確認をもとめるとかできそうです。
おそらく市販の(というか出回っている)アンチウイルスソフトはフィルタドライバ
として動作しているのでしょう。
>2事前にウイルスとして登録したプログラムが動作を発見したら警告するについて
これも前述のフィルタドライバとして動作し、プログラムの実行を見つけるという方
法かもしれません。
ほかにプロセスを列挙し、特定のアプリケーションが起動していたら警告するという
事を考えましたが、それだとすでに実行されているのでダメでしょう・・・・
>3これは事前に定義したデータと比較すればできるだろうと考えています。
ウイルス側もバレないように自分のコードを変化させ、実行直前にもとの姿へ戻ると
いった方法で隠れようとするので対策が必要かと思われます。例えば、隔離された領
域で実行し明らかに不審な行動をする場合はメッセージボックスを表示するとかです。
(「ヒューリスティックスキャン」とよばれることも)
いづれにせよドライバ(フィルタドライバ)の作成は避けて通れないかと思われます。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
此処までは自分の考えであり実際のアンチウイルスソフトの
実装とは全く関係がありません。ご注意ください。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
一応考えてみたのですが、浅はかな考えで書いていますので、あくまで参考程度にお願いします。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
此処から先は自分の考えであり実際のアンチウイルスソフトの
実装とは全く関係がありません。ご注意ください。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
>1の他のプログラムの動作の状態を取得する方法について。
「不審な動作」というものが例えば、
・「シェルの起動」
・「リッスンを開始する」
についてだとします。
まず、フィルタドライバとして動作する方法。
CreateProcess系やsystem()が呼ばれたら引数を確認し
explorer.exeやcmd.exeを起動したら
メッセージボックスをだし、ユーザーに確認を取る。
といった流れでしょうか・・・?
「リッスンを開始する」
のほうもフィルタドライバを使って処理を横取りしてやれば
できそうですが…
次にAPIフックやDLLインジェクションを用いる方法。
アプリケーションだけ挙動を監視(というか制限?)したければ
APIフックを仕掛けるか、DLLインジェクションをして
CreateProcess系やaccept()をラップしたニセDLLを読ませてそのなかで
引数を確認し、シェル(explorer.exeやcmd.exe)だったらメッセージボックス
をだしてユーザーに確認をもとめるとかできそうです。
おそらく市販の(というか出回っている)アンチウイルスソフトはフィルタドライバ
として動作しているのでしょう。
>2事前にウイルスとして登録したプログラムが動作を発見したら警告するについて
これも前述のフィルタドライバとして動作し、プログラムの実行を見つけるという方
法かもしれません。
ほかにプロセスを列挙し、特定のアプリケーションが起動していたら警告するという
事を考えましたが、それだとすでに実行されているのでダメでしょう・・・・
>3これは事前に定義したデータと比較すればできるだろうと考えています。
ウイルス側もバレないように自分のコードを変化させ、実行直前にもとの姿へ戻ると
いった方法で隠れようとするので対策が必要かと思われます。例えば、隔離された領
域で実行し明らかに不審な行動をする場合はメッセージボックスを表示するとかです。
(「ヒューリスティックスキャン」とよばれることも)
いづれにせよドライバ(フィルタドライバ)の作成は避けて通れないかと思われます。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
此処までは自分の考えであり実際のアンチウイルスソフトの
実装とは全く関係がありません。ご注意ください。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
一応考えてみたのですが、浅はかな考えで書いていますので、あくまで参考程度にお願いします。
Re: セキュリティソフトの作成
ありがとうございます。すごく参考になります。
フィルタドライバを作成すればよいのですか。
早速、調べてみます。
>>ウイルス側もバレないように自分のコードを変化させ
コードを変化させるほど複雑なウイルスはとりあえず、最初は考えずに作るつもりです。
フィルタドライバを作成すればよいのですか。
早速、調べてみます。
>>ウイルス側もバレないように自分のコードを変化させ
コードを変化させるほど複雑なウイルスはとりあえず、最初は考えずに作るつもりです。