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 相关文章推荐
Django框架中方法的访问和查找
Jul 15 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
pycharm创建一个python包方法图解
Apr 10 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python Scrapy爬虫框架的使用
Jan 21 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
python三子棋游戏
May 04 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
Three.js快速入门教程
2016/09/09 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python 字符串格式化代码
2013/03/17 Python
Python深入学习之闭包
2014/08/31 Python
讲解Python中运算符使用时的优先级
2015/05/14 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python中进程和线程的区别详解
2017/10/29 Python
pandas实现选取特定索引的行
2018/04/20 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
开办化妆品公司创业计划书
2013/12/26 职场文书
庆七一活动方案
2014/01/25 职场文书
五一劳动节活动记录
2014/03/23 职场文书
会计求职信范文
2014/05/24 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
学生保证书格式
2015/02/27 职场文书
小学美术教学反思
2016/02/17 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
MySQL触发器的使用
2021/05/24 MySQL
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android