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とかなら上記のやり方でどうにかなるかも。