Shammer's Philosophy

My private adversaria

Lisp Packet Generator を作る・その2

この記事の続きでLisp Packet Generatorを作ってみる。手元の環境で、適当なローカルの宛先のパケットを取得した。その時のSYNパケットでやってみる。取得したパケットは以下のようになっている。

$ tshark -x -i en0 -Y "ip.addr eq 10.255.162.2 && tcp.flags.syn == 1 && tcp.flags.ack == 0"
Capturing on 'Wi-Fi'
0000  00 01 e8 8b 6f 4c 98 01 a7 b6 10 a7 08 00 45 00   ....oL........E.
0010  00 40 e5 26 40 00 40 06 82 46 0a c8 1b 82 0a ff   .@.&@.@..F......
0020  a2 02 c7 31 00 16 8f 1d 91 7e 00 00 00 00 b0 02   ...1.....~......
0030  ff ff 59 0f 00 00 02 04 05 b4 01 03 03 05 01 01   ..Y.............
0040  08 0a 31 0f f1 af 00 00 00 00 04 02 00 00         ..1...........

このバイトの配列のところだけを抜粋し、それをファイルに書き出す。

(with-open-file (packet "newpacket.pcap"
			:direction :output
			:if-exists :supersede
			:if-does-not-exist :create
			:element-type 'unsigned-byte)
  (let ((array-for-l2-header (make-byte-array)))
    (dolist (i (list "00" "01" "e8" "8b" "6f" "4c" "98" "01" "a7" "b6" "10" "a7" "08" "00" "45" "00"
		     "00" "40" "e5" "26" "40" "00" "40" "06" "82" "46" "0a" "c8" "1b" "82" "0a" "ff"
		     "a2" "02" "c7" "31" "00" "16" "8f" "1d" "91" "7e" "00" "00" "00" "00" "b0" "02"
		     "ff" "ff" "59" "0f" "00" "00" "02" "04" "05" "b4" "01" "03" "03" "05" "01" "01"
		     "08" "0a" "31" "0f" "f1" "af" "00" "00" "00" "00" "04" "02" "00" "00"))
      (vector-push-extend (hex2decimal i) array-for-l2-header))
    (dolist (i (coerce array-for-l2-header 'list))
      (write-byte i packet))))
(quit)

これを実行し、作成されたnewpacket.pcapを見てみる。

$ od -t x1 newpacket.pcap 
0000000    00  01  e8  8b  6f  4c  98  01  a7  b6  10  a7  08  00  45  00
0000020    00  40  e5  26  40  00  40  06  82  46  0a  c8  1b  82  0a  ff
0000040    a2  02  c7  31  00  16  8f  1d  91  7e  00  00  00  00  b0  02
0000060    ff  ff  59  0f  00  00  02  04  05  b4  01  03  03  05  01  01
0000100    08  0a  31  0f  f1  af  00  00  00  00  04  02  00  00        
0000116
$

とりあえずは良さそうだ。だが、これをtsharkで開くと・・・

$ tshark -V -r newpacket.pcap 
Frame 1: 78 bytes on wire (624 bits), 78 bytes captured (624 bits)
    Encapsulation type: JavaScript Object Notation (176)
    Frame Number: 1
    Frame Length: 78 bytes (624 bits)
    Capture Length: 78 bytes (624 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: json:data-text-lines]
JavaScript Object Notation
Line-based text data
    \000\001\350\213oL\230\001\247\266\020\247\b\000E\000\000@\345&@\000@\006\202F\n
    \310\033\202\n
    \377\242\002\3071\000\026\217\035\221~\000\000\000\000\260\002\377\377Y\017\000\000\002\004\005\264\001\003\003\005\001\001\b\n
    1\017\361\257\000\000\000\000\004\002\000\000

$

となってしまった。tsharkはやはりpcap形式のファイルを想定しているようだ。パケットでなくJSONのデータを認識してしまっているようだ。やっぱりパケットジェネレータを作成するには、

  • pcap形式のフォーマットで書き出すようにする
  • 既存のpcapからコピーし、必要な箇所を書き換える

というようなことをしないといけなそうだ。前者はハードルが高い。後者はtcprewriteというものと同じ。。。やっぱりRawSocketを直接いじるAPIのない環境でこれをやるのはきつそうだ。TCP接続後のSSL/TLSとかなら上記のやり方でどうにかなるかも。