2011年5月30日月曜日

Wiresharkで自端末へのパケットをキャプチャする為のスクリプト

前からの続きです。

Wiresharkは自分自身へのパケットはキャプチャーできないわけですが、
方法はあります。

ふりっつさんのブログにて分かりやすく解説されています。
【ネットワーク】Wiresharkで自端末へのパケットをキャプチャする方法

ということなので、スクリプト化してみましょう。
ちなみにHey, Scripting Guy!の助力を得て作成しています。

あ、動かすにはMACアドレス入れないとダメなんでよろしく。

' 変数宣言の強制
Option Explicit

'--- 定数一覧 ---

' MACアドレス(“ipconfig /all”でコピー&ペーストしてください。)
Dim strMACAddress
strMACAddress = "XX-XX-XX-XX-XX-XX"

' コンピューター名
Dim strComputer
strComputer = "."



'--- 処理の開始 ---

' WMIサービスからネットワーク接続設定を検索します
' このとき、MACアドレスはコロン区切りに置換して検索する必要があります
Dim colItems
Set colItems = GetObject("winmgmts:\\" & strComputer & "\root\cimv2").ExecQuery( _
 "SELECT * " & _ 
 "FROM Win32_NetworkAdapterConfiguration " & _
 "WHERE IPEnabled = True " & _
 "AND MACAddress = '" & UCase(Replace(strMACAddress, "-", ":")) + "'")

' コマンドを実行するためのオブジェクトを取得
Dim objShell
Set objShell = CreateObject("Wscript.Shell")

' 多分0~1ですが、検索結果分ループします
Dim objItem
For Each objItem In colItems

 ' IPアドレス分ループします
 Dim objAddress
 For Each objAddress In objItem.IPAddress

  ' ARPテーブルに対象のIPアドレスが存在するかチェックします
  ' このときDOS窓がちらっと開きます
  Dim objExec
  Set objExec = objShell.Exec("arp -a")
  Dim flgAlreadyRegist
  flgAlreadyRegist = False
  Do Until objExec.StdOut.AtEndOfStream 
   Dim strLine
   strLine = objExec.StdOut.ReadLine
   If InStr(strLine, LCase(strMACAddress)) <> 0 Then
    flgAlreadyRegist = True
   End If
  Loop

  ' ARPテーブルにIPアドレスが未存在なら登録、存在していたら削除を行います
  ' 同時にルーティングテーブルも操作しておきます
  If Not flgAlreadyRegist Then
   If msgbox("[" _
      & objAddress _
      & "]をルーティングテーブルに登録しますか?", _
     vbOKCancel, _
     "確認") = vbOK Then
    objShell.Run "arp -s " _
     & objAddress _
     & " " _
     & strMACAddress, 0, False
    objShell.Run "route ADD " _
     & objAddress _
     & " mask 255.255.255.255 " _
     & objAddress, 0, False
    Wscript.Echo "[" _
     & objAddress _
     & "]をルーティングテーブルに登録しました。"
   End If
  Else
   If msgbox("[" _
      & objAddress _
      & "]をルーティングテーブルから削除しますか?", _
     vbOKCancel, _
     "確認") = vbOK Then
    objShell.Run "route DELETE " & objAddress, 0, False
    objShell.Run "arp -d " & objAddress, 0, False
    Wscript.Echo "[" _
     & objAddress _
     & "]をルーティングテーブルから削除しました。"
   End If
  End If

 Next

Next
う~ん、google-code-pretifyには辛かったか~、
まあしゃあない。

2014/11/06 追記:
ARPテーブルをこねこねするのは、たぶん管理者権限が必要です。
このスクリプトではARPでエラーが発生しても無視しますのでご注意ください。
エラーチェックするように修正するのは君だ!

0 件のコメント:

コメントを投稿