【问题标题】:String search in packet and printing packet data数据包中的字符串搜索和打印数据包数据
【发布时间】:2016-09-09 01:31:21
【问题描述】:

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

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

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

【问题讨论】:

  • 如果一个MAC地址可能以0x00开头,你如何确定它的结尾?固定长度? rc?
  • 我要搜索整个数据包。

标签: c string search pcap


【解决方案1】:

印刷:

您不能使用 printf("%s", data) 打印数据包。这是因为在出现 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

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多