背景

正在学习网络协议,用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. chef cookbook 实战

    在Workstation中创建cookbook,并且上传到Chef server,以及其他与Chef相关的工作. 安装chef client命令 knife bootstrap 10.6.1.207 ...

  2. windows创建任务计划(周期执行bat脚本)

    https://jingyan.baidu.com/article/ca00d56c767cfae99febcf73.html windows找到任务计划程序: 这台电脑->管理

  3. linux 安裝jdk

    參考博客:http://www.cnblogs.com/wuqianling/p/5381895.html http://www.cnblogs.com/CuteNet/p/3947193.html ...

  4. SGU 乱乱开

    本解题报告 乱抄,乱写,随性随心,不喜多喷! SGU 142: 思路:一个string的字串不会超过2^20个,我们枚举出来就好了. 我出错点:数组RE #include<stdio.h> ...

  5. Spring在Bean中注入集合

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/injecting-collection.html: 如果你想传递多个值,如Java Collect ...

  6. Windows Server 远程桌面报错:No Remote Desktop License Servers Available

    问题描述: 在用远程桌面访问Window Server服务器时,出现如下错误: The remote session was disconnected because there are no Rem ...

  7. 一道题目- Find the smallest range that includes at least one number from each of the k lists

    You have k lists of sorted integers. Find the smallest range that includes at least one number from ...

  8. 2017年记录CS+CV

    2017年3月开学,始终感觉自己计算机基础薄弱,加上之前自己也开始对机器学习,深度学习有一些了解,始终感觉没有入门.自己开始规划系统学习计算机软件(CS)和计算机视觉(CV)的基础知识.@2017/9 ...

  9. HDU2897( 巴什博奕变形)

    邂逅明下 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  10. Unity3d中制作异步Loading进度条所遇到的问题

    背景 通常游戏的主场景包括的资源较多,这会导致载入场景的时间较长.为了避免这个问题,能够首先载入Loading场景.然后再通过Loading场景来载入主场景. 由于Loading场景包括的资源较少,所 ...