如何使用POSIX regexec和C中的libpcap匹配UDP有效负载中的URL

时间:2014-11-11 10:23:28

标签: c regex udp posix libpcap

我尝试使用带有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匹配。

感谢您的建议

1 个答案:

答案 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的方法将无济于事。