如何在C中对数据包(包括标头和有效负载)进行字符串搜索?我尝试使用strstr(),但因为我的目标MAC地址以0x00开头,所以strstr()函数似乎没有进一步进入数据包。此外,数据包中可能有更多的0x00字节。我是否需要逐字节搜索,还是有更快的方法?
另外,我可以使用%s
打印数据包数据吗?我尝试了以下,但没有输出。
while ((rc = pcap_next_ex(pcap, &pkthdr, &data)) >= 0)
printf("%s\n", data);
答案 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;
}