zoukankan      html  css  js  c++  java
  • Python构造IP报文

     1 import socket
     2 import sys
     3 import time
     4 import struct
     5 
     6 HOST, PORT = "10.60.66.66", 10086
     7 
     8 def make_forward_iphdr(source_ip = '1.0.0.1', dest_ip = '2.0.0.2', proto = socket.IPPROTO_UDP) :
     9     # ip header fields
    10     ip_ihl = 5
    11     ip_ver = 4
    12     ip_tos = 0
    13     ip_tot_len = 0  # kernel will fill the correct total length
    14     ip_id = 54321   #Id of this packet
    15     ip_frag_off = 0
    16     ip_ttl = 255
    17     ip_proto = proto
    18     ip_check = 0    # kernel will fill the correct checksum
    19     ip_saddr = socket.inet_aton ( source_ip )   #Spoof the source ip address if you want to
    20     ip_daddr = socket.inet_aton ( dest_ip )
    21 
    22     ip_ihl_ver = (ip_ver << 4) + ip_ihl
    23 
    24     # the ! in the pack format string means network order
    25     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)
    26     return ip_header
    27 
    28 def make_forward_udphdr(src_port = 1024, dst_port = 10086) :
    29     udp_header = struct.pack('!HHHH', src_port, dst_port, 0, 0)
    30     return udp_header
    31     
    32 # checksum functions needed for calculation checksum
    33 def checksum(msg):
    34     s = 0
    35 
    36     # loop taking 2 characters at a time
    37     for i in range(0, len(msg), 2):
    38         w = ord(msg[i]) + (ord(msg[i+1]) << 8 )
    39         s = s + w
    40 
    41     s = (s>>16) + (s & 0xffff);
    42     s = s + (s >> 16);
    43 
    44     #complement and mask to 4 byte short
    45     s = ~s & 0xffff
    46 
    47     return s
    48     
    49 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') :
    50     tcp_source = src_port    # source port
    51     tcp_dest = dst_port   # destination port
    52     tcp_seq = 454
    53     tcp_ack_seq = 0
    54     tcp_doff = 5    #4 bit field, size of tcp header, 5 * 4 = 20 bytes
    55     #tcp flags
    56     tcp_fin = 0
    57     tcp_syn = 1
    58     tcp_rst = 0
    59     tcp_psh = 0
    60     tcp_ack = 0
    61     tcp_urg = 0
    62     tcp_window = socket.htons (5840)    #   maximum allowed window size
    63     tcp_check = 0
    64     tcp_urg_ptr = 0
    65 
    66     tcp_offset_res = (tcp_doff << 4) + 0
    67     tcp_flags = tcp_fin + (tcp_syn << 1) + (tcp_rst << 2) + (tcp_psh <<3) + (tcp_ack << 4) + (tcp_urg << 5)
    68 
    69     # the ! in the pack format string means network order
    70     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)
    71     
    72     source_address = socket.inet_aton(source_ip)
    73     dest_address = socket.inet_aton(dest_ip)
    74     placeholder = 0
    75     protocol = socket.IPPROTO_TCP
    76     tcp_length = len(tcp_header) + len(user_data)
    77 
    78     psh = struct.pack('!4s4sBBH' , source_address , dest_address , placeholder , protocol , tcp_length);
    79     psh = psh + tcp_header + user_data;
    80 
    81     tcp_check = checksum(psh)
    82     #print tcp_checksum
    83 
    84     # make the tcp header again and fill the correct checksum - remember checksum is NOT in network byte order
    85     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)
    86 
    87     # final full packet - syn packets dont have any data
    88     packet = ip_header + tcp_header + user_data
    89     return packet
  • 相关阅读:
    JS案例
    JS案例--Tab栏切换
    currentBackgroundImage:获取按钮背景图片
    笔记:UITextView内容垂直居中方法
    笔记:载入viewcontroller的几种方式
    沙盒文件的创建(简单举例)
    笔记:iOS随机数与随机数据集
    四种传值方法(通知、block、属性、NSUserDefaults)
    笔记:沙盒文件的拷贝
    笔记:iOS字符串的各种用法(字符串插入、字符串覆盖、字符串截取、分割字符串)(别人的代码直接复制过来的,我脸皮有点厚)
  • 原文地址:https://www.cnblogs.com/danxi/p/6377651.html
Copyright © 2011-2022 走看看