今回は、Windows上で、EthernetのRawソケットでパケット送信してみたいなと思い、Python で送信する方法について挑戦してみたので、その方法についてシェアします。
使用ライブラリ
まずは、今回必要となるライブラリです。
- scapy
scapyは、Pythonで有名なEthernetのパケット生成・送受信・解析用のライブラリです。
scapyのインストール方法は以下です。
pip install scapy
上記をコマンドプロンプトで実行すると以下のようになり、successfully installedと表示されればインストール完了となります。

プログラムと実行結果
今回のプログラムの全体は以下の通りです。
# 参考
# https://scapy.readthedocs.io/en/latest/usage.html
from scapy.all import *
def main():
IFACES.show() # IFACE 確認
iface = IFACES.dev_from_index(4) # Iface名取得
socket = conf.L2socket(iface=iface) # ソケット取得
### SEND
print("Ether")
ls(Ether)
pcakt = Ether(dst='11:22:33:44:55:66',src='66:55:44:33:22:11',type=2048)
socket.send(pcakt) # send raw data
print("\n")
print("ARP")
ls(ARP)
pcakt = ARP()
socket.send(pcakt) # send raw data
print("\n")
print("ICMP")
ls(ICMP)
pcakt = ICMP()
socket.send(pcakt) # send raw data
print("\n")
print("IP")
ls(IP)
pcakt = Ether()/IP()
socket.send(pcakt) # send raw data
print("\n")
print("TCP")
ls(TCP)
pcakt = Ether()/IP()/TCP()
socket.send(pcakt) # send raw data
print("\n")
print("Dot1Q")
ls(Dot1Q)
pcakt = Ether()/Dot1Q(vlan=1)/IP()/TCP()
socket.send(pcakt) # send raw data
print("\n")
print("Dot1Q")
ls(Dot1Q)
pcakt = Ether()/Dot1Q(vlan=1)/Dot1Q(vlan=2)/IP()/TCP()
socket.send(pcakt) # send raw data
socket.close()
if __name__ == '__main__':
main()
実行結果は、wiresharkのログを見てもらえればと思います。

ちなみに、wiresharkというのは、パケットキャプチャを行うためのツールで、最も一般的に使用されているフリーソフトのツールになります。
以下からダウンロードできます。
Wireshark · Download
ここからは、プログラムの解説になりますが、次ページにて記載します。
コメント