背景

正在学习网络协议,用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. Tomcat 调优技巧

    Tomcat 调优技巧:1.Tomcat自身调优: ①采用动静分离节约Tomcat的性能: ②调整Tomcat的线程池: ③调整Tomcat的连接器: ④修改Tomcat的运行模式: ⑤禁用AJP连接 ...

  2. zoj 3812 We Need Medicine (dp 状压)

    先贴一下转载的思路和代码,,,:http://blog.csdn.net/qian99/article/details/39138329 状压dp博大精深啊,以后看到n<=50都可以往状压上想, ...

  3. Redis对象的设计与实现

    一.Redis对象结构Redis中的每个对象都由一个redisObject结构表示: typedef struct redisObject { unsigned type;//类型 unsigned ...

  4. python多线程(二)

    原文:http://blog.sina.com.cn/s/blog_4b5039210100esc1.html 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机 ...

  5. 字符串哈希hash

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...

  6. js创建post请求

    /**js提交post请求:隐藏请求参数**/function postDetail(URL, PARAMTERS) { //创建form表单 var temp_form = document.cre ...

  7. 高效的MySQL的批插入 BULK INSERT

    原文:http://www.open-open.com/code/view/1453702496573 MySQL的批插入 BULK INSERT和load data的速度差不多,并且可靠. 语法如下 ...

  8. ubuntu compile php from source code

    10down vote Assuming that you already have the OpenSSL libraries and header files (on rpm systems th ...

  9. centos 重新获取IP hdcp 模式

    centos 重新获取IP hdcp 模式 dhclient -r →release dhclient →renew

  10. Effective C++ 条款五 了解C++默默编写并调用哪些函数

      //申明一个类时,编译器会默认为你提供四个函数. //无参构造函数,析构函数,copy构造函数,copy assignment操作符.     template <typename T> ...