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中的各种装饰器详解
Apr 11 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
python递归实现快速排序
Aug 18 Python
Python引用计数操作示例
Aug 23 Python
Python中如何导入类示例详解
Apr 17 Python
python调用动态链接库的基本过程详解
Jun 19 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
如何Tkinter模块编写Python图形界面
Oct 14 Python
python全面解析接口返回数据
Feb 12 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报表之jpgraph柱状图实例代码
2011/08/22 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
vue模块拖拽实现示例代码
2019/03/09 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
详解在Python和IPython中使用Docker
2015/04/28 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
小学教师自我鉴定
2013/11/07 职场文书
质量安全标语
2014/06/07 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers