生のソケットも同様です。
scapyは、あなたのために多くの魔法を行う素敵な抽象レイヤーですが、あなたが低くなると公平に学習経験を得ることができます。 (rawソケットは、最も近代的なOS'esで上昇権限を必要とすることに注意してください、とあなたがより深く実装を行くようにWindowsとLinuxは異なる場合があります。)
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
これはあなたに文字通り実現し、生のパケットベースのソケットを提供しますあなたのためのすべてのフレーム。これはWindowsとLinuxの間で少し変わりますが、私はこの答えでLinuxに固執します。また、もしあなたがその機能(スニッフィングのもの)を必要とするならば、すべての発信パケットがこのソケットによって受け取られないかもしれないことに注意してください。promiscuous mode関連ヒットの検索を検討してください。
あなたが今やらなければならないことは、彼らが来るセグメントとして、各パケットを扱うかで行くあり、例えば - イーサネットとIPフレームを開梱すると、次のようになります。
frame, meta = s.recvfrom(65565)
print(frame, meta)
ethernet = frame[0:14]
ethernet_segments = struct.unpack("!6s6s2s", ethernet)
mac_source, mac_dest = (binascii.hexlify(mac) for mac in ethernet_segments[:2])
ip = frame[14:34]
ip_segments = struct.unpack("!12s4s4s", ip)
ip_source, ip_dest = (socket.inet_ntoa(section) for section in ip_segments[1:3])
print('MAC Source:', b':'.join(mac_source[i:i+2] for i in range(0, len(mac_source), 2)))
print('MAC Dest:', b':'.join(mac_dest[i:i+2] for i in range(0, len(mac_dest), 2)))
print('IP Source:', ip_source)
print('IP Dest:', ip_dest)
Payloadingは「簡単だろう"、自分でパケットを構築していると考えます。
すべての方法や方法が最も一般的ではありませんが、必要なものを実装することができます。
チェックサム計算のものを含め、同じように簡単に、そこに多くのICMPの例でstructを使用して顔をしているされて送信:
、これは私が知っているこれを行う事前に構築されたライブラリがないので、自分で実装する必要があるロジックです。
しかしこれは、で生のIPトラフィックを送信するのに貢献しました。