Build your own tools

您可以使用Scapy制作自己的自动化工具. 您也可以扩展Scapy,而无需编辑其源文件.

如果您已经构建了一些有趣的工具,请贡献给github Wiki!

Using Scapy in your tools

您可以在自己的工具中轻松使用Scapy. 只需导入您需要的内容并执行此操作即可.

第一个示例以IP或名称作为第一个参数,发送ICMP回显请求数据包并显示完全解剖的返回数据包:

#! /usr/bin/env python

import sys
from scapy.all import sr1,IP,ICMP

p=sr1(IP(dst=sys.argv[1])/ICMP())
if p:
    p.show()

这是一个更复杂的示例,该示例执行ARP ping并报告其使用LaTeX格式找到的内容:

#! /usr/bin/env python
# arping2tex : arpings a network and outputs a LaTeX table as a result

import sys
if len(sys.argv) != 2:
    print "Usage: arping2tex <net>\n  eg: arping2tex 192.168.1.0/24"
    sys.exit(1)

from scapy.all import srp,Ether,ARP,conf
conf.verb=0
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=sys.argv[1]),
              timeout=2)

print r"\begin{tabular}{|l|l|}"
print r"\hline"
print r"MAC & IP\\"
print r"\hline"
for snd,rcv in ans:
    print rcv.sprintf(r"%Ether.src% & %ARP.psrc%\\")
print r"\hline"
print r"\end{tabular}"

这是另一个工具,它将持续监视计算机上的所有接口,并打印它看到的所有ARP请求,甚至在监视模式下也可以显示来自WLAN卡的802.11帧. 请注意sniff()的store = 0参数,以避免将所有数据包一无所获地存储在内存中:

#! /usr/bin/env python
from scapy.all import *

def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")

sniff(prn=arp_monitor_callback, filter="arp", store=0)

有关真实示例,您可以检查Wifitap . 可悲的是,Wifitap不再维护,但仍展示了Scapy的Wi-Fi功能. 可以从github检索代码.

Extending Scapy with add-ons

如果您需要添加一些新协议,新功能等任何内容,则可以将其直接写入Scapy的源文件中. 但这不是很方便. 即使将这些修改集成到Scapy中,也可以更方便地将它们写入单独的文件中.

完成此操作后,可以启动Scapy并导入文件,但这仍然不是很方便. 这样做的另一种方法是使文件可执行,并使其调用名为interact()的Scapy函数:

#! /usr/bin/env python

# Set log level to benefit from Scapy warnings
import logging
logger = logging.getLogger("scapy")
logger.setLevel(logging.INFO)
logger.addHandler(logging.StreamHandler())

from scapy.all import *

class Test(Packet):
    name = "Test packet"
    fields_desc = [ ShortField("test1", 1),
                    ShortField("test2", 2) ]

def make_test(x,y):
    return Ether()/IP()/Test(test1=x,test2=y)

if __name__ == "__main__":
    interact(mydict=globals(), mybanner="Test add-on v3.14")

如果将上面的清单放在test_interact.py文件中并使其可执行,您将得到:

# ./test_interact.py
Welcome to Scapy (0.9.17.109beta)
Test add-on v3.14
>>> make_test(42,666)
<Ether type=0x800 |<IP |<Test test1=42 test2=666 |>>>