Python socket编程之构造IP首部和ICMP首部
这两天在做一个实验需要自己构造IP首部,遇到诸多问题,搞了一天终于搞定。
关于socket的介绍网上一大堆,我只记录构造IP头时我遇到的问题。由于没玩过socket构造IP首部,网上找了段代码研究下,无奈代码跑不动,各种问题,网上搜集资料无果,从基础学起,加上自己的脑洞总算解决了。
我想自己构造一个自定义IP头的ICMP回送请求,网上找了段代码,自己改了改,现在长这个样子:
import socket
import struct
def checksum(source_string):
sum = 0
countTo = (len(source_string)/2)*2
count = 0
while count<countTo:
thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
sum = sum + thisVal
sum = sum & 0xffffffff
count = count + 2
if countTo<len(source_string):
sum = sum + ord(source_string[len(source_string) - 1])
sum = sum & 0xffffffff
sum = (sum >> 16) + (sum & 0xffff)
sum = sum + (sum >> 16)
answer = ~sum
answer = answer & 0xffff
answer = answer >> 8 | (answer << 8 & 0xff00)
return answer
def ping(ip):
s=socket.socket(socket.AF_INET,socket.SOCK_RAW,255)
s.setsockopt(0, socket.IP_HDRINCL, 1)
# now start constructing the packet source_ip = '172.16.12.1'
dest_ip = ip # ip header fields
ihl = 5
version = 4
tos = 0
tot_len = 28
id = 0
frag_off = 0
ttl = 255
protocol = 1
check = 0
saddr =socket.inet_aton ( source_ip ) #Spoof the source ip address if you want to
daddr = socket.inet_aton ( dest_ip )
ihl_version = (version << 4) + ihl
# the ! in the pack format string means network order
ip_header = struct.pack('!BBHHHBBH4s4s', ihl_version, tos, tot_len, id, frag_off, ttl, protocol, check, saddr, daddr)
packet = struct.pack(
"!BBHHH", 8, 0, 0, 0, 0
)
chksum=checksum(packet)
packet = struct.pack(
"!BBHHH", 8, 0, chksum, 0, 0
)
packet=ip_header+packet
s.sendto(packet,(ip,1))
print "done" if __name__=='__main__':
ping('172.31.0.1')
步骤很简单,就是自己创建个套接字,然后把头构造好再发送就行了,但是一般的套接字是无法自己更改IP头的,只能从IP数据报的数据部分开始构造,想要构造IP首部就要用到原始套接字,用原始套接字可以从IP首部开始构造,但是如果用原始套接字需要root权限,开始我在OS X下用IDE,程序总是报错socket.error: [Errno 1] Operation not permitted,就是因为权限的问题,在终端里sudo运行就没有权限问题了(Ps:如果想用root权限打开IDE,又不想切换账户的话,终端里sudo ./IDE就行了)现在有了权限,开始报别的错了,提示socket.error: [Errno 22]Invalid argument。
这是创建原始套接字的代码,第一行第三个值255是IPPROTO_RAW的值,如果要构造IP头,就要加上第二行代码设置IP_HDRINCL,第一个值0是IPPROTO_IP的值
s=socket.socket(socket.AF_INET,socket.SOCK_RAW,255)
s.setsockopt(0, socket.IP_HDRINCL, 1)
如果这样设置在OS X下就会在调用sendto()的位置报Invalid argument错误,后来发现问题出在第一行的第三个参数255上,经测试发现
在OS X下,这个参数置成0或255都会报错
在WINDOWS下 ,这个参数置成0或255都不会报错
在LINUX下,这个参数置成0会报错,置成255不会报错
现在可以构造任意的源IP和目的IP的ICMP回送请求了,IP首部字段的ID,长度,校验和置成0就可以,内核协议栈会修正。
在linux上抓包发现目的IP为同子网下不存在的主机IP时,是抓不到ICMP包的,这是因为主机先发送ARP包请求目的IP的MAC地址得不到回应,而不能进一步发送ICMP回送请求,也就是说PING命令中提示的Request timeout for icmp_seq是因为ARP请求得不到应答而产生的。
Python socket编程之构造IP首部和ICMP首部的更多相关文章
- PYTHON SOCKET编程简介
原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...
- Python Socket 编程示例 Echo Server
简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...
- python socket编程入门(编写server实例)+send 与sendall的区别与使用方法
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- python socket编程笔记
用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...
- [Python_7] Python Socket 编程
0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...
- Python Socket 编程——聊天室演示样例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
随机推荐
- linux系统编程之文件与IO(三):利用lseek()创建空洞文件
一.lseek()系统调用 功能说明: 通过指定相对于开始位置.当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置 函数原型: #include <sys/ ...
- CentOS7查看CPU个数
查看逻辑cpu个数:cat /proc/cpuinfo | grep "processor" | wc -l 查看物理cpu个数:cat /proc/cpuinfo | grep ...
- Mac OS 10.12 - 如何能够像在Windows一样切换中英文输入法和大小写键?
最开始,我切换中英文输入法和大小写键是按照下面博客做到的: http://www.cnblogs.com/sunylat/p/6415563.html 但是当我安装完毕搜狗输入法后,切换中英文输入法和 ...
- 835. Image Overlap
Two images A and B are given, represented as binary, square matrices of the same size. (A binary ma ...
- django 使用celery 实现异步任务
celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...
- $_SERVER[]数组解析
$_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果.__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名. 如果 PHP 以命令行方式运行,该 ...
- 萝卜保卫战3内购破解+Toast窗口增加(Love版)
涉及到一些不同的破解的方法,以及不同的破解思路,还有一些重要权限的删除等. 作者:HAI_ 这次目标是经常玩的萝卜保卫战,不知不觉,已经更新到3了.详细分析请参考https://bbs.ichunqi ...
- (samba启动失败)smb.service: main process exited, code=exited, status=1/FAILURE
按照指示,前往:journalctl -xe 没什么发现,搜的时候有人说也可以查看 journalctl -r 打出来之后我也看不出什么门道来 又看到有人说 smb 方面可以看看 testparm 我 ...
- Sublime Text 3快捷键汇总
转自:http://blog.sina.com.cn/s/blog_73c5cfbe0101ldj8.html Sublime Text 3非常实用,但是想要用好,一些快捷键不可或缺,所以转了这个快捷 ...
- 读Lock-Free论文实践
论文地址:implementing Lock-Free Queue 论文大体讲的意思是:Lock-Base的程序的performance不好,并且a process inside the critic ...