【问题标题】:Sending IP packet with raw socket in python在python中使用原始套接字发送IP数据包
【发布时间】:2018-04-28 15:08:37
【问题描述】:

总结一下我的问题:
我有两个问题:

  1. 我无法发送 IP_PACKET 变量
  2. 如何在 IP 数据包中设置标志? (用于发送)

这是我的代码:

#! /usr/bin/python
import socket
import struct
import sys


def Create_SOCKET():
        global ST
        try:
                ST = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
        except socket.error as MSG:
                print "[ERROR] Socket creation error:\n", MSG
                sys.exit()


def IP_HEADER(Source_IP, Destination_IP):
        global IP_PACKET

        #Variable validation
        IP_VER = 4
        IP_IHL = 5
        IP_TOS = 0
        IP_TOL = 60
        IP_IDT = 54331
        IP_FLG = 2 # 0x02 DF
        IP_FOS = 0
        IP_TTL = 64
        IP_PROTO = socket.IPPROTO_TCP
        IP_CHECKSUM = 0

        IP_IHL_VER = (IP_VER << 4) + IP_IHL

        SRC_IP = socket.inet_aton(Source_IP)
        DST_IP = socket.inet_aton(Destination_IP)

        IP_PACKET = struct.pack("!BBHHHBBH4s4s", IP_IHL_VER, IP_TOS, IP_TOL, IP_IDT, IP_FOS, IP_TTL, IP_PROTO, IP_CHECKSUM, SRC_IP, DST_IP)



        def Send_PACKET(IFACE):
                try:
                        Create_SOCKET()
                        ST.bind((IFACE, 0))
                        ST.send(IP_PACKET)
                        print "[SUCESS] Packet was sent."
                except socket.error as MSG:
                        print "[ERROR] Packet can't send:\n", MSG
                        sys.exit()


IP_HEADER(sys.argv[1], sys.argv[2])
Send_PACKET(sys.argv[3])

Python 版本:2.7
操作系统:Ubuntu 16.04
谢谢你帮助我。

【问题讨论】:

  • 你的函数 Send_PACKET 存在于你的另一个函数 IP_HEADER() 的范围内 - 你不能从外部调用它,只能从 IP_HEADER() 内部调用。
  • 另外:如果您遇到错误,请将错误消息逐字(逐字)复制并粘贴到您的问题中。除非您需要传达布局错误,否则请避免使用屏幕截图。 - 它包含的信息可以让我们在阅读所有代码的情况下使这一事实变得显而易见。谢谢。

标签: python python-2.7 ip raw-sockets


【解决方案1】:

您的范围是错误的,该函数是在其他函数中定义的,因此它仅在本地可用:

def f1():
    pass

def f2():
    def f3():
        pass 
    f3() # works, local scope visible

f1() # works
f2() # works
try:    
    f3() # does not work, is not known, only inde f2()'s scope known
except NameError as ne:
    print(ne)

输出:

name 'f3' is not defined

要修复你的结构,让IP_HEADER(Source_IP, Destination_IP):返回构造的IP_PACKET,将其存储到一个变量中并提供给Send_PACKET(IFACE,data) - 也取消缩进Send_PACKET(...)

def IP_HEADER(Source_IP, Destination_IP):
    # your code
    return IP_PACKET

def Send_PACKET(IFACE,data):  # unindent 4 spaces so its in normal scope
    # your code, use data instead of IP_PACKET

data = IP_HEADER(sys.argv[1], sys.argv[2])
Send_PACKET(sys.argv[3], data)

【讨论】:

    【解决方案2】:

    第一个问题的解法是:

    global IP_PACKET
    IP_PACKET =[]
    

    【讨论】:

    • 代码不应作为图像添加,请编辑答案并以文本格式添加代码。
    猜你喜欢
    • 2018-11-16
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多