0

我设法捕获了通过网络传输的文件的内容,但是我无法捕获file name.

class Program
{
    static void Main(string[] args)
    {
        // Retrieve the device list
        CaptureDeviceList devices = CaptureDeviceList.Instance;

        // Print out the available network devices
        foreach (ICaptureDevice dev in devices)
        {
            // Extract a device from the list
            ICaptureDevice device = dev;

            // Register our handler function to the
            // 'packet arrival' event
            device.OnPacketArrival += device_OnPacketArrival;

            // Open the device for capturing
            const int readTimeoutMilliseconds = 1000;
            device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);

            // Start the capturing process
            device.StartCapture();

        }

        Console.ReadKey();

        foreach (var dev in CaptureDeviceList.Instance)
        {
            dev.StopCapture();
            dev.Close();
        }
    }


    private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
    {
        var data = Encoding.ASCII.GetString(e.Packet.Data);
        //HERE! When it exists, I need get the file name that was trafficked (eg. FileName.docx).
    }
}

拦截文件访问协议 (NFS | SMB | AFP) 时如何使用 Sharpcap 获取文件名?

4

1 回答 1

1

数据包中的文件名在哪里?

这取决于用于传输文件的协议。

如果是 HTTP,它可能会在 GET 请求中获取文件或在 PUT 或 POST 中发送文件,但不能保证这一点。

如果是 FTP,它将在 STOR 或 RETR 命令中发送或获取文件。

如果是 NFS 或 SMB 或 AFP 等文件访问协议,它将在用于查找或打开文件以进行读取或写入的请求中。

另请注意,原始数据包数据中有一大堆不是文件内容的东西。从网络跟踪中获取文件名和内容的程序的代码量可能至少是您上面编写的代码量的 100 倍;这不是一个容易编写的程序。

该程序必须解释数据包数据中的链路层、IP 和 TCP 或 UDP 标头,以及用于 NFS 的 ONC RPC 标头、用于 SMB 的 NetBIOS-over-TCP 或 SMB-over-TCP 标头、DSI 标头用于 AFP,以及用于 NFS、SMB 和 AFP 的协议标头。然后,它必须识别文件的查找或打开请求,并确定哪些文件的读写请求,并根据读写请求中的文件偏移量重新组合正在读取或写入的数据,以获得文件数据。

于 2015-07-19T23:41:56.777 回答