背景

正在学习网络协议,用Python写起来方便点,可以快速熟悉协议本身,也给自己补充一些Python库。

偶然看到这篇文章,讲的是Python发ARP包,发现是Python2的,这里改了一下,用Python3实现。

环境

Ubuntu 18.04 + Python 3.6.5 + dpkt 1.9.1

网络相关信息见代码部分。

代码

#!/usr/bin/python
# -*- coding:utf-8 -*- import dpkt
import socket
import sys
import signal
import ipaddress
import struct

my_iface = "ens33"
my_mac = "00:0c:29:6a:f9:7e"
my_ip = "192.168.93.151"
sniff_network = "192.168.93.0/24"
debug = False ETH_ADDR_BROADCAST = "ff:ff:ff:ff:ff:ff"
ETH_ADDR_UNSPEC = "00:00:00:00:00:00" def eth_ntoa(buffer):
mac_addr = ''
for intval in struct.unpack("!BBBBBB", buffer):
if intval > 15:
replace_str = '0x'
else:
replace_str = 'x'
# pythonic!
mac_addr = ''.join([mac_addr, hex(intval).replace(replace_str, '')])
return mac_addr def eth_aton(buffer):
intvals = buffer.split(':')
rv = b''
for iv in intvals:
rv += struct.pack("!B", int(iv, 16))
# 下面这种也行
# rv += bytes.fromhex(iv)
return rv def build_arp(addr):
arp_p = dpkt.arp.ARP()
arp_p.sha = eth_aton(my_mac)
arp_p.spa = socket.inet_aton(my_ip)
arp_p.tha = eth_aton(ETH_ADDR_UNSPEC)
arp_p.tpa = socket.inet_aton(addr)
arp_p.op = dpkt.arp.ARP_OP_REQUEST packet = dpkt.ethernet.Ethernet()
packet.src = eth_aton(my_mac)
packet.dst = eth_aton(ETH_ADDR_BROADCAST)
packet.type = dpkt.ethernet.ETH_TYPE_ARP
packet.data = arp_p if debug:
print(dpkt.hexdump(bytes(packet)))
return packet # exits after 2 seconds
def quit(sig_num, frame):
print("Scan ended.")
sys.exit(0) signal.alarm(2)
signal.signal(signal.SIGALRM, quit) # build arp packet and send it one by one
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW)
s.bind((my_iface, dpkt.ethernet.ETH_TYPE_ARP)) for host in ipaddress.ip_network(sniff_network).hosts():
packet = build_arp(host.compressed)
s.send(bytes(packet))
print('sniff host: ', host.compressed) # receive arp answer packets
while True:
data = s.recv(1024)
if debug:
print(dpkt.hexdump(data)) sys.stdout.flush()
answer = dpkt.ethernet.Ethernet(data)
answer_arp_p = answer.data
answer_src_ip = socket.inet_ntoa(answer_arp_p.spa)
answer_src_mac = eth_ntoa(answer_arp_p.sha)
answer_dst_ip = socket.inet_ntoa(answer_arp_p.tpa) if debug:
print(dpkt.hexdump(data)) if answer_arp_p.op != dpkt.arp.ARP_OP_REQUEST:
if answer_dst_ip == my_ip:
print("Answer: {0} is at {1}".format(answer_src_ip,
my_mac))

测试

......
sniff host: 192.168.93.251
sniff host: 192.168.93.252
sniff host: 192.168.93.253
sniff host: 192.168.93.254
Answer: 192.168.93.2 is at :0c::6a:f9:7e
Answer: 192.168.93.1 is at :0c::6a:f9:7e
Answer: 192.168.93.160 is at :0c::6a:f9:7e
Answer: 192.168.93.254 is at :0c::6a:f9:7e
Scan ended.

引用

一篇讲解dpkt库和网络协议的文章,很不错,只是例子是Python2的。

DPKT CheatSheet

TODO

一开始用struct的pack/unpack实现,比较底层,可以熟悉协议首部的构成和位、字节,无符号等概念。

高级点的,用dpkt,里面把常见的协议都封装成了对象,用起来也很方便。

打算下一步再熟悉scapy,然后是Trex。

利用Python3的dpkt库进行ARP扫描的更多相关文章

  1. 鸟枪换炮,利用python3对球员做大数据降维(因子分析得分),为C罗找到合格僚机

    鸟枪换炮,利用python3对球员做大数据降维(因子分析得分),为C罗找到合格僚机 原文转载自「刘悦的技术博客」https://v3u.cn/a_id_176 众所周知,尤文图斯需要一座欧冠奖杯,C罗 ...

  2. oracle 利用flashback将备库激活为read wirte(10g 及上)

    oracle 利用flashback将备库激活为read wirte(10g 及上) 环境: OS: CENTOS 6.5 X64 DB: ORACLE 10.2.0.5 主库操作: SQL> ...

  3. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  4. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  5. VHDL学习:利用Quartus自带库3步快速完成状态机

    Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...

  6. Python3 urllib.request库的基本使用

    Python3 urllib.request库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urlli ...

  7. 【转】Python3 (入门6) 库的打包与安装

    Python3 (入门6) 库的打包与安装 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/6940288 ...

  8. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  9. python的arp扫描

    python的arp扫描 from optparse import *from scapy.all import *parser = OptionParser()parser.add_option(& ...

随机推荐

  1. 创建mavenweb项目

    1.创建maven项目 2.创建maven-web项目 3.将webapp文件夹复制到maven项目下,src路径下

  2. 使用putty上传下载文件(pscp)

    putty作为ssh工具开源免费,简单易用.可是如何使用它来上传和下载文件呢?答案在于pscp. pscp下载地址:http://www.chiark.greenend.org.uk/~sgtatha ...

  3. 程序包com.sun.image.codec.jpeg不存在解决方法

    https://blog.csdn.net/u011627980/article/details/50436842

  4. 51 NOD 1325 两棵树的问题

    Discription 对于 100% 的数据, N<=50. solution: 发现N比较小,所以我们可以花O(N^2)的代价枚举两颗树的联通块的LCA分别是哪个点,然后现在问题就变成了:选 ...

  5. 解决Eclipse中SVN版本信息不显示的问题

    eclipse  中使用 svn 插件,原本正常,未作任何更改,最近几天突然eclipse 中查看文件时,文件后面的 版本号 . 文件的状态图标 等等都不见了.以为有插件冲突,卸载了好多其他的相关的插 ...

  6. Oracle EBS - 工单状态

    Job status update 1. Job的几种状态 unreleased --未核发 released--已核发 complete --完成 complete no charges--完成不计 ...

  7. C#使用PrintDocument打印 多页 打印预览

    PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...

  8. flask的debug模式下,网页输入pin码进行调试

    网站后端Python+Flask .FLASK调试模式之开启DEBUG与PIN使用? 自动加载: # 方式一 1 2 if __name__ == '__main__':     app.run(ho ...

  9. Android 最新控件 Toolbar

    之前Android的ActionBar好像做项目从没用过.除了google自己,并没有多少人用,究其原因,主要是由于ActionBar不够灵活,不可以随心所欲的定制,后来Goole也发现了这一点,然后 ...

  10. push代码到github时,每次都要输入用户名和密码的问题

    问题原由 我在Github上 建立了一个小项目TauStreamingServer,可是在每次push代码 的时候,都要求输入用户名和密码,很是麻烦. 如何才能避免每次都输入用户名和密码呢? 解决办法 ...