これは、C# & .Net Framework 4.0 で作成しました


はじめに
Windows 上で、TCP/UDP/ICMP Traceroute する CUI プログラムです。

.NET Framework と RawSocket を使っているので、WinPcap は不要です。

ただし、RawSocket を使っているので、管理権限が必要です。

仕様上(受信と送信が別々の RawSocket)、同時並行的に Traceroute を実施すると、結果が混乱します。


仕様
  1. RawSocket で、ICMP の TTL 切れメッセージの受信監視をします(プロミスキャスモード)。
  2. 別の TcpClient/UdpClient/RawSocket で、TTL を+1ずつしながら、TCP接続/UDP送信/ICMP送信を試みます





UDP Traceroute 時の UDP アプリケーションについて
同梱されているのは以下

UDP Tracaeroute する際の「-DataFile」に指定する際の参考になると思う


Windows Firewall について
WindowsFirewallにて、ICMPv4の受信を許可する必要があるかもしれない。

free158a.png



ICMPのタイプとコードの指定方法について
「-cICMP 値」で、送信ICMPのタイプとコード、ターゲットに到着した際の受信ICMPのタイプとコードを指定する事ができる。

-cICMP 「送信ICMPのタイプ」(,「送信ICMPのコード」)(->「受信ICMPのタイプ」(,「受信ICMPのコード」))


例えば、通常の ICMP Tracerouteっぽくするには(ICMP Echo Request/Reply)
-cICMP 8,0->0,0 「-ICMP」オプションと同義


各既定値は、以下
送信ICMPタイプ 8 受信ICMPタイプ 0
送信ICMPコード 0 受信ICMPコード -1(任意/チェックしない/無視する)



ICMPのIDとシーケンス番号と「-IsICMPMinHeader」オプションについて
既定では、送信 ICMP ヘッダサイズは、8バイトに設定されています(ICMP Traceroute の既定が ICMP Echo Request&ICMP Echo Replyのため)。
オプション「-IsICMPMinHeader」で、送信 ICMP ヘッダサイズを4バイトにする事ができます(ver2.1.2.0)。

以下は、8バイトのICMPヘッダの場合です。
ICMP Echo Request の「ID」(ICMPヘッダの5-6バイト目)が、0x0000 だと、反応しないルータがあったので、既定値を「1」とした(ver2.1.1.0)。
ICMP Echo Request の「ID」(ICMPヘッダの5-6バイト目)が、0x0000 だと、反応しないルータがあったので、「-ICMPId」オプションで任意値を指定できるようにした(ver2.1.1.0)。

ICMP Echo Request の「シーケンス番号」(ICMPヘッダの7-8バイト目)をデータグラムごとに+1ずつしていくオプション「-ICMPSeqInc」を新設した(ver2.1.1.0)。


「-DetectNoRoute」オプションについて
既定では、TCP では Syn+Ack または RST。ICMPでは指定されたタイプ(とコード)の返信。UDPの場合は ICMPType=3 または返信パケット。のみで、スキャンを終了させるのですが、このオプションでは、以下の ICMPデータグラムでもスキャンを終了するようになります。
ルーティングテーブルに該当レコードがなくて転送できないルータからの返信なども認識されるようになるということです。

中断させるICMPタイプ
3,4,6,12,31,32,33,34



Usage
C:\>sTcpTraceRoute.exe
sTcpTraceRoute.exe ver 2.1.4.0
                            created by active@window.goukaku.com

sTcpTraceRoute.exe Host <<Port>> [options]

      Compiled ver.v4.0.30319
           Run ver.v4.0.30319(Win64)
-----------------------------------------
                            Host is Hostname or IPv4 Only
                            DefaultPort=80/tcp
  -RecieveIPAddr <<addr>> : myIPAddress(recieve address)
                    -Auto : Auto Bind NIC
      -SourcePort <<num>> : static SourcePort
        -MaxTTL   <<num>> : Max TTL (Default=30)
        -MinTTL   <<num>> : Start TTL (Default=1)
        -Interval <<num>> : IntervalTime(ms) (Default=1000ms)
        -Timeout  <<num>> : Timeout(ms) (Default is SocketDefault)
                -Strictly : Recieve Packet detect closely.
           -DetectNoRoute : Recieve ICMP Error.
             -RecordRoute : Use RecordRouteOptions
       -SSR <<Addr(CSV)>> : Use StrictSourceRoutingOptions
       -LSR <<Addr(CSV)>> : Use  LooseSourceRoutingOptions
                      -TR : Use TracerouteOptions RFC1393
                     -UDP : UDP  Mode
                    -ICMP : ICMP Mode
-cICMP <<st,sc->rt(,rc)>> : ICMP Mode
              -ICMPSeqInc : ICMPv4 Echo Request's Sequence Number Increment
          -ICMPId <<num>> : ICMPv4 Echo Request's Id
         -IsICMPMinHeader : ICMPv4 HeadeSize is 4Byte
       -DataFile <<file>> : SendingData for UDP/ICMP
         -Data <<string>> : SendingData for UDP/ICMP (Encoding is shift_jis)
         -DataHex <<hex>> : SendingData for UDP/ICMP

      This Program need UAC's Admin



動作環境
Microsoft .NET Framework4.0 ClientProfile & 管理権限(UAC)


使用方法
CUI プログラムなので、引数無で起動すれば、usage がでるよ。


インストール方法と使用方法
  1. sTcpTraceRoute.lzh をダウンロードします。

    ダウンロードしたファイルを解凍しします。
    (LHAは、吉崎栄泰氏が、著作権を所有)

  2. sTcpTraceRoute.exe を管理者権限で実行してみればなんとなくわかるかと思います。



削除方法
sTcpTraceRoute.exe を削除するだけです。


免責など
プログラムの改変については、各自の責任で行う分については、自由に行って結構です。(参考になりましたメールをくれると、うれしい...(*^_^*))

修正BSDライセンスで配布します。


Version2.1.4.0DownLoad(sTcpTraceRoute.lzh as 47,918byte) (sTcpTraceRoute.lzh.base64)

履歴



Qiita に記事を書いた
sTcpTraceRoute Manual


mail to active@window.goukaku.com