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. Hive节点及原理

    1.什么是Hive:hive是一种基于hadoop的数据仓库,能够将结构化的数据映射成一张表,并提供HQL进行查询.其数据是存储在hdfs上,本质是将sql命令转化成MapReduce来执行. 2.H ...

  2. 【爬虫】把抓到数据存起来——爬虫绝配mongodb

    [爬虫]把抓到数据存起来——爬虫绝配mongodb 视频地址 抓取数据的方法,前面的课程该讲的都已经讲了,爬取下来数据只是第一步,第二步就是要先存起来.我们最容易想到的就是存文件里喽,python写文 ...

  3. Optimize Cube.js Performance with Pre-Aggregations

    转自:https://cube.dev/blog/high-performance-data-analytics-with-cubejs-pre-aggregations/ 可以了解 Pre-Aggr ...

  4. 洛谷 P1613 跑路 题解

    P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...

  5. Ancient Go(简单DFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5546 AC代码: #include<iostream> #include<cstdi ...

  6. 发现Mathematica中求逆出错

    发现Mathematica中应用Inverse求逆时出错.

  7. Java Redis缓存穿透/缓存雪崩/缓存击穿,Redis分布式锁实现秒杀,限购等

    package com.example.redisdistlock.controller; import com.example.redisdistlock.util.RedisUtil; impor ...

  8. SpringMVC将通过ajax发送的 json数据封装成JavaBean

    SpringMVC将通过ajax发送的 json数据封装成JavaBean 通过ajax发送的 json数据封装成JavaBean对发送时有如下要求: 1.发送的数据类型必须时UTF-8 2.发送的必 ...

  9. go中的方法以及自定义类型代码示例

    package main import "fmt" type user struct { name string age int sex string } type admin s ...

  10. iOS开发之如何在用户删除应用后保持一些数据

    在开发过程中我们有时候在用户删除时候保存一些信息在用户下次安装应用时候使用,这个时候我们可以使用剪切版UIPasteboard的FindUIPasteboard和钥匙串keychain的使用 剪切版剪 ...