我尝试使用带有POSIX正则表达式的C语言中的Libpcap从UDP有效负载中捕获URL。我已经尝试了所有的方法,但没有任何东西返回命中。
我已经粘贴了我的代码部分,我试图捕获UDP有效负载附带的URL。
size_udp = 8;
udp = (struct sniff_udp*)(pktptr + ETHER_HDRLEN + size_udp);
payload_udp = (u_char *)(pktptr + ETHER_HDRLEN + size_ip + size_udp);
size_payload_udp = ntohs(ip->ip_len) - (size_ip + size_udp);
int reg,sh;
regex_t re;
regmatch_t pm;
char *hit;
reg = regcomp(&re, ( "\.youtube\.com", "\.googlevideo\.com","ytimg"), REG_EXTENDED);
sh = regexec(&re, &payload_udp, 2, &pm, REG_EXTENDED);
strcpy(hit, payload_udp + (pm.rm_so - pm.rm_eo));
if(
(strstr(hit,"youtube") != NULL)
|| (strstr(hit,"googlevideo") != NULL)
|| (strstr(hit,"video") != NULL)
|| (strstr(hit,"ytimg") != NULL)
)
{
//Writing to dump file
pcap_dump(usr, pkthdr, pktptr - lnkhdrlen);
}
这是我的代码。我想知道为什么正则表达式与UDP Payload中的Youtube的URL匹配。
感谢您的建议
答案 0 :(得分:0)
一个可能的原因是这一行:
reg = regcomp(&re, ( "\.youtube\.com", "\.googlevideo\.com","ytimg"), REG_EXTENDED);
在你的第二个论点中,关于youtube和googlevideo的表达方式是未成功的。也就是说,实际编译的是:
reg = regcomp(&re, "ytimg", REG_EXTENDED);
你的编译器应该警告过这个......
此外,在
sh = regexec(&re, &payload_udp, 2, &pm, REG_EXTENDED);
有些论点没有意义。 pm只是一个匹配结构,但你告诉regexec它可以保存2.& payload_udp是你的有效负载指针的地址,而不是你正在搜索的字符串中的指针。仅执行编译正则表达式时不需要REG_EXTENDED。 sh(返回值)已经告诉您是否存在匹配(如果它返回0)(如果它返回REG_NOMATCH)。无需复制和strstr。顺便说一句,你的strcpy会复制(没有限制)到任意内存位置命中的位置,并且只要它没有找到' 0' -byte就会复制。
最后,如果您的udp有效负载不是以空字符结尾的字符串(或者至少以您希望匹配的以空字符结尾的字符串开头),那么使用regexec的方法将无济于事。