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

在实验中需要自己构造单独的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:

#-------------------------------------------------------------------------------

import sys

import socket

from impacket import ImpactDecoder, ImpactPacket

  

def main():

  

  if len(sys.argv) < 3:

    print "Use:
%s" % sys.argv[0]

    print "Use:
%s" % 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中利用原始套接字进行网络编程的示例的更多相关文章

  1. 基于TCP的socket套接字的网络编程(客户端/服务端模式)

    于数据完整性要求较高的场合,就应采用TCP协议. IP网络层提供IP寻址和路由.因为在网络上数据可以经由多条线路到达目的地,网络层负责找出最佳的传输线路. IP地址与数据包: IP层就是把数据分组从一 ...

  2. Python 套接字socketserver网络编程

    为什么使用socketserver 虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用还是可以的,但是如果要在生产环境中使用,那是万万不够的. ...

  3. Python之socket(套接字)

    Socket 一.概述 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  4. 原始套接字SOCK_RAW

    原始套接字SOCK_RAW 实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM).而这些数据包 ...

  5. UNIX网络编程——原始套接字SOCK_RAW

    实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM).而这些数据包都是由系统提供的协议栈实现, ...

  6. Linux原始套接字实现分析---转

    http://blog.chinaunix.net/uid-27074062-id-3388166.html 本文从IPV4协议栈原始套接字的分类入手,详细介绍了链路层和网络层原始套接字的特点及其内核 ...

  7. Linux原始套接字抓取底层报文

    1.原始套接字使用场景 我们平常所用到的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据.收到的数据往往只包括应用层数据,原有的头部信息在传递 ...

  8. LINUX 网络编程 原始套接字

    一 原始套接字 原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM.SOCK_DGRAM的套接字,它实现于系统核心.然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP.I ...

  9. Python开发【第八篇】:网络编程 Socket

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

随机推荐

  1. LightOJ - 1299 - Fantasy Cricket(DP, 数学)

    链接: https://vjudge.net/problem/LightOJ-1299 题意: 考虑成,U位置的点要往后放,D位置往前放 Dp[i][j]表示处于i位置,还有j个U没有放下. s[i] ...

  2. Coins in a Line

    Description There are n coins in a line. Two players take turns to take one or two coins from right ...

  3. go html

    package main import ( "fmt" "html/template" "net/http" ) type User str ...

  4. python3文本读取与写入常用代码

    创建文件夹: import os import shutil def buildfile(echkeyfile): if os.path.exists(echkeyfile): #创建前先判断是否存在 ...

  5. Vue模板语法(一)

    Vue模板语法 一 vue简介 Vue.js是一套构建用户界面的渐进式框架. 与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. Vue 的核心库只关注视图层,并且非常容易学习,非常容易与 ...

  6. (三)IDEA使用,功能面板

    IDEA 打开界面后周围有许多的功能面板 常用的界面 1.project:项目的目录结构: 2.Structure:结构界面:在这个界面里可以看到选择的类,接口 的结构,有哪些方法,字段,等: 3. ...

  7. Oracle 分区表中本地索引和全局索引的适用场景

    背景 分区表创建好了之后,如果需要最大化分区表的性能就需要结合索引的使用,分区表有两种索引:本地索引和全局索引.既然存在着两种的索引类型,相信存在即合理.既然存在就会有存在的原因,也就是在特定的场景中 ...

  8. learning java ProcessHandle 获取进程相当信息

    Process p = rt.exec("notepad.exe"); ProcessHandle ph = p.toHandle(); System.out.println(&q ...

  9. 【EF】vs2017中没有EF模型

    在添加->新建项目 中找不到实体模型? 或者 在vs中打开edmx文件时,显示的只有文本,没有图形模式 原因:是因为没有安装实体模型插件 解决方法: 1.打开网址 https://marketp ...

  10. 原创:Solr Wiki 中关于Suggester(搜索推荐)的简单解读

       Solr Wiki Suggester Suggester - a flexible "autocomplete" component.(搜索推荐) A common nee ...