Python中利用原始套接字进行网络编程的示例


Posted in Python onMay 04, 2015

在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互。

因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送。

使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的限制。

下面开始构造HTTP数据包,

IP层和TCP层使用python的Impacket库,http内容自行填写。

#!/usr/bin/env python
 
#-------------------------------------------------------------------------------
# Name:   raw_http.py
# Purpose:    construct a raw http get packet
#
# Author:  Yangjun
#
# Created:    08/02/2014
# Copyright:  (c) Yangjun 2014
# Licence:    <your licence>
#-------------------------------------------------------------------------------
 
import sys
import socket
from impacket import ImpactDecoder, ImpactPacket
 
def main():
 
  if len(sys.argv) < 3:
    print "Use: %s <src ip> <dst ip>" % sys.argv[0]
    print "Use: %s <src ip> <dst ip> <cnt>" % sys.argv[0]
    sys.exit(1)
  elif len(sys.argv) == 3:
    src = sys.argv[1]
    dst = sys.argv[2]
    cnt = 1
  elif len(sys.argv) ==4:
    src = sys.argv[1]
    dst = sys.argv[2]
    cnt = sys.argv[3]
  else:
    print "Input error!"
    sys.exit(1)
#print src, dst
  ip = ImpactPacket.IP()
  ip.set_ip_src(src)
  ip.set_ip_dst(dst)
 
  # Create a new ICMP packet of type ECHO.
  icmp = ImpactPacket.ICMP()
  tcp = ImpactPacket.TCP()
  tcp.set_th_sport(55968)
  tcp.set_th_dport(80)
  tcp.set_th_seq(1)
  tcp.set_th_ack(1)
  tcp.set_th_flags(0x18)
  tcp.set_th_win(64)
 
  tcp.contains( ImpactPacket.Data("GET /att/DIYLife/41264/528 HTTP/1.1\r\nHost: 192.168.111.1\r\nAccept-Encoding: identity\r\n\r\n"))
 
  ip.contains(tcp)
 
  # Open a raw socket. Special permissions are usually required.
  s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
  s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
  seq_id = 0
  while cnt >= 1:
    # Calculate its checksum.
    seq_id = seq_id + 1
    tcp.set_th_seq(seq_id)
    tcp.calculate_checksum()
 
    # Send it to the target host.
    s.sendto(ip.get_packet(), (dst,80))
    cnt= cnt -1
 
if __name__ == '__main__':
  main()
Python 相关文章推荐
python获取mp3文件信息的方法
Jun 15 Python
python对DICOM图像的读取方法详解
Jul 17 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
使用python+whoosh实现全文检索
Dec 09 Python
python3连接kafka模块pykafka生产者简单封装代码
Dec 23 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
python正则表达式 匹配反斜杠的操作方法
Aug 07 Python
python利用线程实现多任务
Sep 18 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
Python 绘制多因子柱状图
May 11 Python
python通过索引遍历列表的方法
May 04 #Python
python实现将元祖转换成数组的方法
May 04 #Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 #Python
python通过定义一个类实例作为ftp回调方法
May 04 #Python
Python中__new__与__init__方法的区别详解
May 04 #Python
Python中的ConfigParser模块使用详解
May 04 #Python
Python的__builtin__模块中的一些要点知识
May 02 #Python
You might like
PHP实现Soap通讯的方法
2014/11/03 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
Javascript无阻塞加载具体方式
2013/06/28 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python基于twisted实现简单的web服务器
2014/09/29 Python
Python 导入文件过程图解
2019/10/15 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
PHP面试题及答案二
2015/05/23 面试题
群众路线教育实践活动心得体会
2014/03/07 职场文书
库房管理员岗位职责
2014/03/09 职场文书
眼镜促销方案
2014/03/15 职场文书
银行委托书范本
2014/04/04 职场文书
525心理活动总结
2014/07/04 职场文书
施工员岗位职责
2015/02/10 职场文书
公司捐书倡议书
2015/04/27 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
个人业务学习心得体会
2016/01/25 职场文书
Redis 常见使用场景
2021/08/30 Redis
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
Redis基本数据类型String常用操作命令
2022/06/01 Redis