字符串搜索包和打印包数据

时间:2016-09-09 01:31:22

标签: c string search pcap

如何在C中对数据包(包括标头和有效负载)进行字符串搜索?我尝试使用strstr(),但因为我的目标MAC地址以0x00开头,所以strstr()函数似乎没有进一步进入数据包。此外,数据包中可能有更多的0x00字节。我是否需要逐字节搜索,还是有更快的方法?

另外,我可以使用%s打印数据包数据吗?我尝试了以下,但没有输出。

while ((rc = pcap_next_ex(pcap, &pkthdr, &data)) >= 0)
   printf("%s\n", data);

1 个答案:

答案 0 :(得分:1)

印刷:

您无法使用printf打印数据包("%s",数据)。这是因为当出现NULL字节(' \ 0')时终止打印,这在引用传输数据时非常频繁。您可以使用以下命令从%str中打出%len个字节,同时忽略NULL字节,但它不会让您走得太远,因为大多数字节都是不可见的:

// len = pkthdr.len
printf("%.*s", len, str);

至于搜索,您可以使用非标准函数strnstr:

#include <stdio.h>
#include <string.h>

char *strnstr(const char *haystack, const char *needle, size_t len)
{
        int i;
        size_t needle_len;

        /* segfault here if needle is not NULL terminated */
        if (0 == (needle_len = strlen(needle)))
                return (char *)haystack;

        for (i=0; i<=(int)(len-needle_len); i++)
        {
                if ((haystack[0] == needle[0]) &&
                        (0 == strncmp(haystack, needle, needle_len)))
                        return (char *)haystack;

                haystack++;
        }
        return NULL;
}

int main()
{
    char big_str[] = "abc\0cde\0efg\0";

    printf("%s", strnstr(big_str, "efg", 12));

    return 0;
}

但请阅读:https://stackoverflow.com/a/25705264/6814540