建立自己的工具

您可以使用scapy制作自己的自动化工具。您还可以扩展scapy而不必编辑其源文件。

如果你已经建立了一些有趣的工具,请贡献回github wiki!

在工具中使用 Scapy

你可以在自己的工具中很容易地使用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()

配置Scapy的记录器

Scapy使用Python的 logging 模块。此记录器是自定义的,以支持颜色和频率过滤器。默认设置为 WARNING (当不处于交互模式时),但您可以使用例如:

import logging
logging.getLogger("scapy").setLevel(logging.CRITICAL)

禁用几乎所有日志。(如果发生严重故障,Scapy将无法正常工作)

备注

在交互模式下,默认日志级别为 INFO

更多例子

这是一个更复杂的示例,它执行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请求,即使是在802.11帧上,从处于监控模式的Wi-Fi卡打印。注意store=0参数sniff()以避免将所有数据包免费存储在内存中:

#! /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 .

使用附加组件扩展 Scapy

如果您需要添加一些新的协议、新的函数等,可以直接将其写入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)

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 |>>>