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类方法与对象方法
Mar 15 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
浅谈python新式类和旧式类区别
Apr 26 Python
django最快程序开发流程详解
Jul 19 Python
Python笔记之观察者模式
Nov 20 Python
新手入门学习python Numpy基础操作
Mar 02 Python
django queryset相加和筛选教程
May 18 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 Python
关于 Python json中load和loads区别
Nov 07 Python
总结三种用 Python 作为小程序后端的方式
May 02 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断点续传之如何分割合并文件
2014/03/22 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
php实现映射操作实例详解
2019/10/02 PHP
Javascript string 扩展库代码
2010/04/09 Javascript
JQueryEasyUI datagrid框架的基本使用
2013/04/08 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
详解Python字符串对象的实现
2015/12/24 Python
Python中str.format()详解
2017/03/12 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
python将数据插入数据库的代码分享
2020/08/16 Python
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
招聘专员岗位职责
2014/03/07 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
安全保证书范文
2014/04/29 职场文书
倡议书格式模板
2014/05/13 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
运动会加油稿100字
2014/09/19 职场文书
五年级学生评语大全
2014/12/26 职场文书
关于感谢信的范文
2015/01/23 职场文书
骨干教师个人总结
2015/02/11 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
详解nginx进程锁的实现
2021/06/14 Servers
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
Elasticsearch 聚合查询和排序
2022/04/19 Python