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脚本
Sep 01 Python
python之wxPython菜单使用详解
Sep 28 Python
RC4文件加密的python实现方法
Jun 30 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
django的csrf实现过程详解
Jul 26 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
深入学习python多线程与GIL
Aug 26 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 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 计划任务 检测用户连接状态
2012/03/29 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
php时间戳转换代码详解
2019/08/04 PHP
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Flask数据库迁移简单介绍
2017/10/24 Python
答题辅助python代码实现
2018/01/16 Python
浅谈python常用程序算法
2019/03/22 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
大学生通用个人的自我评价
2014/02/10 职场文书
新任教师自我鉴定
2014/02/24 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
工会经费申请报告
2015/05/15 职场文书
《观察物体》教学反思
2016/02/17 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS
JavaScript前端面试组合函数
2022/06/21 Javascript
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS