メモめもメモ

環境構築やプログラミングに関するメモ

Pythonでパケットキャプチャ(Windows用)

RAWソケットを使ってWindowsでパケットキャプチャを行います。 実行には管理者権限が必要です。このスクリプトでキャプチャできるのはIPから上位のレイヤーであり、Ethernetヘッダはキャプチャできません。

コード

import socket

MYHOST = "自分のIPアドレスを入れる"

def hexdump(data):
    result = []
    for i in range(0, len(data), 16):
        binary = " ".join(["%02X" % x for x in data[i:i+16]])
        text = "".join(chr(x) if 0x20 <= x <= 0x7E else "." for x in data[i:i+16])
        result.append("[%04X] %-48s    %s" % (i, binary, text))
    print("\n".join(result))


with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) as sock:
    sock.bind((MYHOST, 0))
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
    sock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
    try:
        while True:
            hexdump(sock.recvfrom(65536)[0])
            print("")
    except:
        pass
    finally:
        sock.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)