Libpcap:字级别的数据包过滤

时间:2014-10-08 11:36:26

标签: libpcap jnetpcap

使用Libpcap我试图在字级过滤数据包。例如,如果有“Hello”字样,我想丢弃数据包。

我将如何编写表达式?

1 个答案:

答案 0 :(得分:0)

我想我已经在jNetPcap论坛上回答了你,但为了确保,我也会在这里发布我的答案。

基本上,这里有几种方法可以完成此过滤。由于您没有指定“过滤”的确切程度,因此我将介绍一种使用低级捕获过滤器和java中的过滤器的方法。

捕获标题

如果您只需要查看 tcp有效负载知道偏移应该出现“Hello”,我会尝试使用Wireshark的捕获过滤器生成器{ {3}} - 这允许您为tcp有效负载创建匹配捕获过滤器的字符串。

在您的示例中(假设tcp有效负载偏移为0),捕获过滤器(使用bpf语法)将如下所示:

not (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48656c6c && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:1] = 0x6f)

阅读链接页面上的说明,了解究竟发生了什么。注意:我添加了“not”,因为我们要丢弃与此过滤器匹配的数据包,而不是相反。

您可以通过Pcap对象上的setFilter(PcapBpfProgram bpf)在jNetPcap中使用此过滤器。

如果您不想限制自己使用tcp有效负载和固定偏移量,则不能使用捕获过滤器,需要在java代码中过滤此数据包。

使用Java过滤

一个例子是这个简单的jnetpcap包处理程序:

public class PacketHandler implements PcapPacketHandler<Object> {
    @Override
    public void nextPacket(PcapPacket packet, Object unused) {
        StringBuilder str = new StringBuilder();
        /* 
         Convert the whole packet (headers + payloads) to a string.
         Adjust the first and last parameter if you don't want to look at the whole packet
         */
        packet.getUTF8String(0, str, packet.getTotalSize());
        String rawStringData = str.toString();
        if (rawStringData.contains("Hello")) {
            // we have found a packet that contains the text "Hello"
            return; // ignore it
        }
        // do something with the packet that does not contain "Hello"
    }
}

[...]
// use packet handler
pcap.loop(numberOfPackets, new PacketHandler(), null);

如果你知道“Hello”的起始偏移并且不想将整个数据包或有效负载转换为字符串,你也可以尝试方法getUTF8Char(index)