同事發現在 windows 2016 裡 winpcap 的 rpcapd.exe ,
無法像在其他 windows 版本把封包抓取送出.
可是, 自己寫的測試程式卻可以順利抓取到封包.
後來, 自己重新編譯一次 rpcapd.exe 發現還真的不work.
看了一下, 整個流程發現它在windows平台,
有多call PacketSetLoopbackBehavior 和 PacketSetMinToCopy,
#ifdef WIN32
//
// these flags are supported on Windows only
//
if (fp != NULL && fp->adapter != NULL)
{
/* disable loopback capture if requested */
if(flags & PCAP_OPENFLAG_NOCAPTURE_LOCAL)
{
if(!PacketSetLoopbackBehavior(fp->adapter, NPF_DISABLE_LOOPBACK))
{
snprintf(errbuf, PCAP_ERRBUF_SIZE, "Unable to disable the capture of loopback packets.");
pcap_close(fp);
return NULL;
}
}
/* set mintocopy to zero if requested */
if(flags & PCAP_OPENFLAG_MAX_RESPONSIVENESS)
{
if(!PacketSetMinToCopy(fp->adapter, 0))
{
snprintf(errbuf, PCAP_ERRBUF_SIZE, "Unable to set max responsiveness.");
pcap_close(fp);
return NULL;
}
}
}
#endif //WIN32
把這特別的部分註解掉, 編譯出來的 rpcapd.exe 在windows 2016 就正常了.
暫時先這樣workaround.
就等比較閒暇再來研究到底是怎麼一回事.
Ref: https://github.com/nmap/nmap/issues/1329