最新のScapy(2.3.3.dev957)では、Macにpcapやdnetモジュールのインストールが不要っぽい

前回の記事の中で、MacへのScapyのインストールについて触れました。
Mac + Python2 + Scapyで、DHCPサーバを探してみた - メモ的な思考的な

 
公開後、Twitterにて

とのツイートをいただきました。

そこで、pcapやdnetモジュールが不要かどうかを試してみました。

 
目次

 

環境

 

NG: PyPIにあるScapy (v2.3.3)を使う場合

PyPIからpip installした場合です。

# Mac OS Xのバージョンを確認
$ sw_vers -productVersion
10.11.6

# Pythonのバージョン確認
$ python --version
Python 2.7.14

# virtualenv環境を有効化
$ virtualenv envdev
...
Installing setuptools, pip, wheel...done.

$ source envdev/bin/activate

# pipの状態を確認
(envdev) $ pip list
pip (9.0.1)
setuptools (38.4.0)
wheel (0.30.0)

# scapyをインストール
(envdev) $ pip install scapy
Collecting scapy
Installing collected packages: scapy
Successfully installed scapy-2.3.3

# インストール後の確認
(envdev) $ pip list
pip (9.0.1)
scapy (2.3.3)
setuptools (38.4.0)
wheel (0.30.0)

 
試しにコードを実行してみると、エラーになりました。

(envdev) $ python discover_dhcp_server.py 
Traceback (most recent call last):
  File "discover_dhcp_server.py", line 3, in <module>
    from scapy.layers.dhcp import DHCP, BOOTP
  File "/path/to/envdev/lib/python2.7/site-packages/scapy/layers/dhcp.py", line 14, in <module>
    from scapy.ansmachine import *
  File "/path/to/envdev/lib/python2.7/site-packages/scapy/ansmachine.py", line 14, in <module>
    from scapy.sendrecv import send,sendp,sniff
  File "/path/to/envdev/lib/python2.7/site-packages/scapy/sendrecv.py", line 14, in <module>
    from scapy.arch.consts import DARWIN, FREEBSD
  File "/path/to/envdev/lib/python2.7/site-packages/scapy/arch/__init__.py", line 79, in <module>
    from scapy.arch.pcapdnet import *
  File "/path/to/envdev/lib/python2.7/site-packages/scapy/arch/pcapdnet.py", line 328, in <module>
    import pcapy as pcap
ImportError: No module named pcapy

 

NG: GitHubのタグ「v2.3.3」を使う場合

次にGitHubにあるソースコードからインストールしてみます。

まずは、タグ v2.3.3 を指定してインストールしてみます。

なお、タグやコミットなどを指定してpip installする方法は、以下に記載がありました。
Install specific git commit with pip - Stack Overflow

# virtualenvを抜ける
$ deactivate

# 別のvirtualenvを構築して、そちらにインストール
$ virtualenv envdev2
$ source envdev2/bin/activate

(envdev2) $ pip list
pip (9.0.1)
setuptools (38.4.0)
wheel (0.30.0)

# v2.3.3を指定してインストール
(envdev2) $ pip install git+https://github.com/secdev/scapy.git@v2.3.3
Collecting git+https://github.com/secdev/scapy.git@v2.3.3
  Cloning https://github.com/secdev/scapy.git (to v2.3.3) to /private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-as1YTj-build
Installing collected packages: scapy
  Running setup.py install for scapy ... done
Successfully installed scapy-2.3.3

# インストールを確認
(envdev2) $ pip list
pip (9.0.1)
scapy (2.3.3)
setuptools (38.4.0)
wheel (0.30.0)

 
試しにコードを実行してみると、エラーになりました。

(envdev2) $ python discover_dhcp_server.py 
Traceback (most recent call last):
  File "dhcp/discover_dhcp_server.py", line 3, in <module>
    from scapy.layers.dhcp import DHCP, BOOTP
  File "/path/to/envdev2/lib/python2.7/site-packages/scapy/layers/dhcp.py", line 14, in <module>
    from scapy.ansmachine import *
  File "/path/to/envdev2/lib/python2.7/site-packages/scapy/ansmachine.py", line 14, in <module>
    from scapy.sendrecv import send,sendp,sniff
  File "/path/to/envdev2/lib/python2.7/site-packages/scapy/sendrecv.py", line 14, in <module>
    from scapy.arch.consts import DARWIN, FREEBSD
  File "/path/to/envdev2/lib/python2.7/site-packages/scapy/arch/__init__.py", line 79, in <module>
    from scapy.arch.pcapdnet import *
  File "/path/to/envdev2/lib/python2.7/site-packages/scapy/arch/pcapdnet.py", line 328, in <module>
    import pcapy as pcap
ImportError: No module named pcapy

 

OK: GitHubの最新コミットを使う場合

最後に、現時点の最新コミット aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7ソースコードをインストールしてみます。

# 再度、別のvirtualenv環境を作る
(envdev2) $ deactivate
$ virtualenv envdev3
$ source envdev3/bin/activate

(envdev3) $ pip list
pip (9.0.1)
setuptools (38.4.0)
wheel (0.30.0)

# インストール
(envdev3) $ pip install git+https://github.com/secdev/scapy.git@aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7
Collecting git+https://github.com/secdev/scapy.git@aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7
  Cloning https://github.com/secdev/scapy.git (to aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7) to /private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-3zebOf-build
  Could not find a tag or branch 'aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7', assuming commit.
Installing collected packages: scapy
  Running setup.py install for scapy ... done
Successfully installed scapy-2.3.3.dev957

# インストール後の確認
(envdev3) $ pip list
pip (9.0.1)
scapy (2.3.3.dev957)
setuptools (38.4.0)
wheel (0.30.0)

 
試しにコードを実行すると、問題なく動作しました。

(envdev3) $ python discover_dhcp_server.py 
###[ Ethernet ]### 
  dst       = FF:FF:FF:FF:FF:FF
  src       = 00:00:00:00:00:04
  type      = 0x800
###[ IP ]### 
     version   = 4
     ihl       = None
     tos       = 0x0
     len       = None
     id        = 1
     flags     = 
     frag      = 0
     ttl       = 64
     proto     = udp
     chksum    = None
     src       = 0.0.0.0
     dst       = 255.255.255.255
     \options   \
###[ UDP ]### 
        sport     = bootpc
        dport     = bootps
        len       = None
        chksum    = None
###[ BOOTP ]### 
           op        = BOOTREQUEST
           htype     = 1
           hlen      = 6
           hops      = 0
           xid       = 0
           secs      = 0
           flags     = 
           ciaddr    = 0.0.0.0
           yiaddr    = 0.0.0.0
           siaddr    = 0.0.0.0
           giaddr    = 0.0.0.0
           chaddr    = '\x00\x00\x00\x00\x00\x04'
           sname     = ''
           file      = ''
           options   = 'c\x82Sc'
###[ DHCP options ]### 
              options   = [message-type='discover' end]

Begin emission:
Finished to send 1 packets.
..........^C
Received 10 packets, got 0 answers, remaining 1 packets

 
これより、GitHubの最新コミットから持ってくれば

  • pcap
  • dnet

モジュールは不要なようです。

 
guedouさん、教えていただきありがとうございました。