トップページへ



■-■-■ ウィンドウズの計算機でtcpチェックサムを計算 ■-■-■

なかなかネットに直接的な解説が載っていなくてハマったのでメモ。

5 0.950136 10.0.0.30 10.0.0.100 TCP 70 53896 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1
Internet Protocol Version 4, Src: 10.0.0.30 (10.0.0.30), Dst: 10.0.0.100 (10.0.0.100)
Transmission Control Protocol, Src Port: 53896 (53896), Dst Port: http (80), Seq: 0, Len: 0
Checksum: 0xd257 [validation disabled]

こんなTCP SYNのパケットのTCPチェックサムを計算機で算出する方法について。

■■■ TCPヘッダ作成 ■■■

TCPヘッダ全体をWireshark→右クリック→Copy→Bytes→Hex Streamします。
d28800506b16338000000000800216d0d2570000020405b40101040201030300

そのうちのチェックサムである「d257」を「0000」に置換。
d28800506b16338000000000800216d000000000020405b40101040201030300

■■■ 疑似ヘッダ作成 ■■■

疑似ヘッダってTCPヘッダのマネをすることかなと思ったら、IPヘッダの情報を使って独自
の形式でヘッダを作ってしまうことみたいです。

下記IPヘッダ値をWireshark→右クリック→Copy→Bytes→Hex Streamしていきます。
Source: 10.0.0.30 (10.0.0.30) → 0a00001e
Destination: 10.0.0.100 (10.0.0.100) → 0a000064
Protocol: TCP (6) → 06

TCPからも同様に。
Header length: 32 bytes
ここが一番ハマりポイント。32バイトをTCPヘッダで表現すると"8"になってます。上の
hex stream内だと"80"にも見えますが、実はこれ1バイトではなく4ビット長の値なので、
16進数で言うと左側の"8"しか使わないと。

8イコール8バイトかというとそうではなくて、
http://ja.wikipedia.org/wiki/Transmission_Control_Protocol
によると
「ヘッダ長(4ビット)- TCPヘッダのサイズを32ビットワード単位で表す。」
なんだそうです。
つまり8かける4バイト(32ビット)である32バイト、がTCPヘッダ長だと。

さらにここから32バイトを16進数で表現するため、32を10進数→16進数変換して"20"にな
ります。

ということで、疑似ヘッダをようやく組み合わせます。
0a00001e + 0a000064 + 00(チェックサム作成前のため0で埋めます) + 06 + 0020
つなげると、
0a00001e0a00006400060020
となり、疑似ヘッダ完成です。

■■■ 疑似ヘッダとTCPヘッダをくみあわせる ■■■
疑似ヘッダ 0a00001e0a00006400060020
TCPヘッダ d28800506b16338000000000800216d000000000020405b40101040201030300
これらをつなげて
0a00001e0a00006400060020d28800506b16338000000000800216d000000000020405b40101040201030300
となります。

2バイトごと(4文字ごと)に " + " を挿入して、計算機に流し込めるようにします。
0a00 + 001e + 0a00 + 0064 + 0006 + 0020 + d288 + 0050 + 6b16 + 3380 + 0000 + 0000 + 8002 + 16d0 + 0000 + 0000 + 0204 + 05b4 + 0101 + 0402 + 0103 + 0300
↑のようになります。

これをマウスで選択+コピーして、計算機ソフトを開く。
Windowsボタン→すべてのプログラム→アクセサリ→電卓

16進数で計算できるようにする。
表示→プログラマ

この状態でペーストして「= (イコール)」を押す。
22DA6
という結果が返ってくるはず。

このうち右側4ケタ「2DA6」と左側の5桁目以降を足す。
2DA6 + 2
↑の電卓にコピペしてイコールを押すと、
2DA8
と出る。これのxorを取る。
2DA8 xor ffff
ということですが、電卓には2DA8をコピペ、xor押下、ffffをコピペ、イコール押下。

すると「D257」が出ます。

Checksum: 0xd257 [validation disabled]

と同じになりますね。Done.

質問・間違い指摘などは shimizu@tokyovalley.com へ。
Hiro