python构造IP报文实例

我就废话不多说了,大家还是直接看代码吧!

import socket
import sys
import time
import struct

HOST, PORT = "10.60.66.66", 10086

def make_forward_iphdr(source_ip = '1.0.0.1', dest_ip = '2.0.0.2', proto = socket.IPPROTO_UDP) :
  # ip header fields
  ip_ihl = 5
  ip_ver = 4
  ip_tos = 0
  ip_tot_len = 0 # kernel will fill the correct total length
  ip_id = 54321  #Id of this packet
  ip_frag_off = 0
  ip_ttl = 255
  ip_proto = proto
  ip_check = 0  # kernel will fill the correct checksum
  ip_saddr = socket.inet_aton ( source_ip )  #Spoof the source ip address if you want to
  ip_daddr = socket.inet_aton ( dest_ip )

  ip_ihl_ver = (ip_ver << 4) + ip_ihl

  # the ! in the pack format string means network order
  ip_header = struct.pack('!BBHHHBBH4s4s', ip_ihl_ver, ip_tos, ip_tot_len, ip_id, ip_frag_off, ip_ttl, ip_proto, ip_check, ip_saddr, ip_daddr)
  return ip_header

def make_forward_udphdr(src_port = 1024, dst_port = 10086) :
  udp_header = struct.pack('!HHHH', src_port, dst_port, 0, 0)
  return udp_header

# checksum functions needed for calculation checksum
def checksum(msg):
  s = 0

  # loop taking 2 characters at a time
  for i in range(0, len(msg), 2):
    w = ord(msg[i]) + (ord(msg[i+1]) << 8 )
    s = s + w

  s = (s>>16) + (s & 0xffff);
  s = s + (s >> 16);

  #complement and mask to 4 byte short
  s = ~s & 0xffff

  return s

def make_tcp_data(ip_header, src_port = 1024, dst_port = 10086, source_ip='1.0.0.1', dest_ip='2.0.0.2', user_data = 'test') :
  tcp_source = src_port  # source port
  tcp_dest = dst_port  # destination port
  tcp_seq = 454
  tcp_ack_seq = 0
  tcp_doff = 5  #4 bit field, size of tcp header, 5 * 4 = 20 bytes
  #tcp flags
  tcp_fin = 0
  tcp_syn = 1
  tcp_rst = 0
  tcp_psh = 0
  tcp_ack = 0
  tcp_urg = 0
  tcp_window = socket.htons (5840)  #  maximum allowed window size
  tcp_check = 0
  tcp_urg_ptr = 0

  tcp_offset_res = (tcp_doff << 4) + 0
  tcp_flags = tcp_fin + (tcp_syn << 1) + (tcp_rst << 2) + (tcp_psh <<3) + (tcp_ack << 4) + (tcp_urg << 5)

  # the ! in the pack format string means network order
  tcp_header = struct.pack('!HHLLBBHHH' , tcp_source, tcp_dest, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags, tcp_window, tcp_check, tcp_urg_ptr)

  source_address = socket.inet_aton(source_ip)
  dest_address = socket.inet_aton(dest_ip)
  placeholder = 0
  protocol = socket.IPPROTO_TCP
  tcp_length = len(tcp_header) + len(user_data)

  psh = struct.pack('!4s4sBBH' , source_address , dest_address , placeholder , protocol , tcp_length);
  psh = psh + tcp_header + user_data;

  tcp_check = checksum(psh)
  #print tcp_checksum

  # make the tcp header again and fill the correct checksum - remember checksum is NOT in network byte order
  tcp_header = struct.pack('!HHLLBBH' , tcp_source, tcp_dest, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags, tcp_window) + struct.pack('H' , tcp_check) + struct.pack('!H' ,tcp_urg_ptr)

  # final full packet - syn packets dont have any data
  packet = ip_header + tcp_header + user_data
  return packet

补充知识:python做在域名作为关键字的POST报文集合分类

将报文按域名分成不同的集合,而后写入excel,主要使用了字典数据结构

输入内容:

[域名,post报文(一个域名有多条,在不同行),域名类型]

输出内容:

[域名,POST报文集合,域名类型]

#-*- encoding:UTF-8 -*-
import openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook
import numpy as np
import pandas as pd
import re
strinfo = re.compile('[ ]+')
book=load_workbook('ex2.xlsx','utf-8')
sheet=book.worksheets[0]
rows=sheet.max_row
cols=sheet.max_column
Post={}
Type={}
for i in range(2,rows+1):#向字典里添加元素
 dn=sheet.cell(i,1).value
 pv=sheet.cell(i,2).value
 tv=sheet.cell(i,3).value
 if Post.get(dn)==None:#第一次遇到這个域名
 Post[dn]=pv
 Type[dn]=tv
 else:
 Post[dn]+='\n'+pv
wb=Workbook()
sh=wb.worksheets[0]#输出表格
for i in range(2,rows+1):#从字典中取出内容存入excel
 dn=sheet.cell(i,1).value
 if i==2:
 Post[dn]=Post[dn].replace('/',' ').replace(':',' ')
 Post[dn]=Post[dn].replace('(',' ').replace(')',' ')
 Post[dn]=Post[dn].replace('*',' ').replace(';',' ')
 Post[dn]=Post[dn].replace('\t',' ').replace('\n',' ')
 Post[dn]=Post[dn].replace('$',' ').replace('@',' ')
 Post[dn]=Post[dn].replace('=',' ').replace('&',' ')
 Post[dn]=Post[dn].replace(',',' ').replace('?',' ')
 Post[dn]=strinfo.sub(' ',Post[dn])
 sh.append([dn,Post[dn],Type[dn]])
 else:
 if dn!=sheet.cell(i-1,1).value:
  Post[dn]=Post[dn].replace('/',' ').replace(':',' ')
  Post[dn]=Post[dn].replace('(',' ').replace(')',' ')
  Post[dn]=Post[dn].replace('*',' ').replace(';',' ')
  Post[dn]=Post[dn].replace('\t',' ').replace('\n',' ')
  Post[dn]=Post[dn].replace('$',' ').replace('@',' ')
  Post[dn]=Post[dn].replace('=',' ').replace('&',' ')
  Post[dn]=Post[dn].replace(',',' ').replace('?',' ')
  Post[dn]=strinfo.sub(' ',Post[dn])
  sh.append([dn,Post[dn],Type[dn]])
 else:
  continue
replace('_x000D_','')
wb.save('out.csv')

以上这篇python构造IP报文实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python基础教程之获取本机ip数据包示例

    这几天用到了raw socket,用python写了些demo程序,这里记录下. 首先我们看一个简单的sniffer程序: 复制代码 代码如下: #! /usr/bin/python# code for linuximport socket#s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.I

  • Python中IP地址处理IPy模块的方法

    安装 先下载源码,地址:ps://pypi.python.org/pypi/IPy/">https://pypi.python.org/pypi/IPy/ ,然后解压后使用命令python setup.py install安装. 使用 1.显示IP类型 >>> IP('192.168.1.1').version() 4 >>> IP('::1').version() 6 类似如上所示,通过version方法可以的判断输入的IP是IPv4还是IPv6 .

  • 使用Python获取并处理IP的类型及格式方法

    公网与私有网络的判断其实十分简单,只要记住私有网络的三个网段.不过,对于记性不好的人或者学识不是很高的机器来说,有一种判断方法还是有必要的. 写如下脚本: from IPy import IP ip1 = IP('192.168.1.2') ip2 = IP('11.12.13.14') print("ip1 type: %s" % ip1.iptype()) print("ip2 type: %s" % ip2.iptype()) print("ip2

  • python构造IP报文实例

    我就废话不多说了,大家还是直接看代码吧! import socket import sys import time import struct HOST, PORT = "10.60.66.66", 10086 def make_forward_iphdr(source_ip = '1.0.0.1', dest_ip = '2.0.0.2', proto = socket.IPPROTO_UDP) : # ip header fields ip_ihl = 5 ip_ver = 4 i

  • python获取代理IP的实例分享

    平时当我们需要爬取一些我们需要的数据时,总是有些网站禁止同一IP重复访问,这时候我们就应该使用代理IP,每次访问前伪装自己,让"敌人"无法察觉. oooooooooooooooOK,让我们愉快的开始吧! 这个是获取代理ip的文件,我将它们模块化,分为三个函数 注:文中会有些英文注释,是为了写代码方便,毕竟英文一两个单词就ok了 #!/usr/bin/python #-*- coding:utf-8 -*- """ author:dasuda "&

  • Python正则表达式匹配ip地址实例

    本文实例讲述了正则表达式匹配ip地址实例.代码结构非常简单易懂.分享给大家供大家参考. 主要实现代码如下: import re reip = re.compile(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])') for ip in reip.findall(line): print "ip>>>", ip PS:关于正则,这里再为大家推荐2款非常方便的正则表达式工具供大家参考使用: JavaScript正则表达式

  • python扫描proxy并获取可用代理ip的实例

    今天咱写一个挺实用的工具,就是扫描并获取可用的proxy 首先呢,我先百度找了一个网站:http://www.xicidaili.com 作为例子 这个网站里公布了许多的国内外可用的代理的ip和端口 我们还是按照老样子进行分析,就先把所有国内的proxy扫一遍吧 点开国内部分进行审查发现,国内proxy和目录为以下url: http://www.xicidaili.com/nn/x 这个x差不多两千多页,那么看来又要线程处理了... 老样子,我们尝试是否能直接以最简单的requests.get(

  • Python之自动获取公网IP的实例讲解

    0.预备知识 0.1 SQL基础 ubuntu.Debian系列安装: root@raspberrypi:~/python-script# apt-get install mysql-server Redhat.Centos 系列安装: [root@localhost ~]# yum install mysql-server 登录数据库 pi@raspberrypi:~ $ mysql -uroot -p -hlocalhost Enter password: Welcome to the Ma

  • python 爬虫 批量获取代理ip的实例代码

    实例如下所示: import urllib.request import os, re,sys,time try: from StringIO import StringIO except ImportError: from io import StringIO loca = re.compile(r"""ion":"\D+", "ti""") #伪装成浏览器 header = {'User-Agent':

  • 对python判断ip是否可达的实例详解

    python中使用subprocess来使用shell 关于threading的用法 from __future__ import print_function import subprocess import threading def is_reachable(ip): if subprocess.call(["ping", "-c", "2", ip])==0:#只发送两个ECHO_REQUEST包 print("{0} is a

  • python正则表达式匹配IP代码实例

    这篇文章主要介绍了python正则表达式匹配IP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import re re.search(r'([1]\d\d|2[0-4]\d|25[0-5])','192') #re.search(r'([01]\d\d)','1XX') #[01] \d \d # 1 0-9 0-9 #re.search(r'(2[0-4]\d)','2XX') #2 [0-4] \d #2 0-4 0-9 #re.

  • python构造icmp echo请求和实现网络探测器功能代码分享

    python发送icmp echo requesy请求 复制代码 代码如下: import socketimport struct def checksum(source_string):    sum = 0    countTo = (len(source_string)/2)*2    count = 0    while count<countTo:        thisVal = ord(source_string[count + 1])*256 + ord(source_strin

  • 详解Python判定IP地址合法性的三种方法

    IP合法性校验是开发中非常常用的,看起来很简单的判断,作用确很大,写起来比较容易出错,今天我们来总结一下,看一下3种常用的IP地址合法性校验的方法. IPv4的ip地址格式:(1~255).(0~255).(0~255).(0~255) 方法1: 正则表达式判定法 最简单的实现方法是构造一个正则表达式.判断用户的输入与正则表达式是否匹配.若匹配则是正确的IP地址,否则不是正确的IP地址. 复制代码 代码如下: ^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(

随机推荐