使用 Python 向网络驱动程序发送 IOCTL 调用

Posted

技术标签:

【中文标题】使用 Python 向网络驱动程序发送 IOCTL 调用【英文标题】:Sending IOCTL Call to Network Driver using Python 【发布时间】:2015-09-22 21:06:43 【问题描述】:

我想从 Python 应用程序向我在 Ubuntu 12.04 中运行的假网络接口发送 IOCTL 调用。我知道我可以打开一个套接字并将其绑定到假网络接口管理的网络,然后使用fcntl.ioctl(socket, IOC_COMMAND_NUM, some_struct) 发送 IOCTL 调用。但是,这似乎使用了与我需要的不同的网络接口。所以,我的问题是,如何确保使用特定的网络接口?而且,仅仅为了发送一个 IOCTL 调用而打开一个套接字似乎很麻烦,那么有没有绕过这一步呢?下面是一些与上述行为相同的示例 Python 代码。

>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.bind(("192.168.0.1",0))
>>> fcntl.ioctl(sock,IOC_COMMAND_NUM,some_struct)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
IOError: [Errno 25] Inappropriate ioctl for device

# This proves that it is sending the IOCTL to a different interface because my
# interface automatically returns success for any IOCTL call. 

下面是ifconfig myDummyNetInter的输出。

myDummyNetInter0 Link encap:Ethernet  HWaddr e2:44:46:d5:79:3e  
      inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
      inet6 addr: fe80::e044:46ff:fed5:793e/64 Scope:Link
      UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:0 (0.0 B)  TX bytes:2682 (2.6 KB)

如果有帮助,我确实有另一个使用此网络接口用 C++ 编写的应用程序,没有任何问题。 (包括 IOCTL 调用。)

谢谢,感谢您的任何帮助。

【问题讨论】:

【参考方案1】:

虽然这不一定能回答我的所有问题,但我还是找到了解决方案。 IOCTL 调用与我预期的有点不同。我需要解决的第一件事是使用正确的 IOCTL 编号。与字符驱动程序不同,网络驱动程序只能使用特定范围(从 0x89F0 开始)用于自定义 IOCTL。我必须做的另一件事是将ifreq 结构作为IOCTL 调用的第三个参数。 ifreq 结构有一个 ifr_name 成员,用于选择要与之交互的特定网络接口。这两个修复让我能够与我的驱动程序完美通信。

【讨论】:

以上是关于使用 Python 向网络驱动程序发送 IOCTL 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 netlink 库向网络接口发送命令

C++ - 向 WBF 发送 IOCTL 命令以获取 Windows 上的传感器属性

如何从驱动程序向另一个驱动程序(不在同一个堆栈中)进行 IOCTL 调用(在 Windows 上)

使用 DeviceIoControl 从应用程序向驱动程序发送数据

使用 IOCTL 将音频数据从用户模式发送到 Sysvad(虚拟音频驱动程序)

如何在 C 中将 IOCTL 发送到 Windows 上的所有驱动程序