当前位置:   article > 正文

QT 中使用Npcap 来抓取网卡数据_qt使用npcap抓包

qt使用npcap抓包

最近在开发someip 的测试工具,手动测试的时候通过wireshark 来抓取网络中的数据,在工具的自动化测试中希望可以保存网卡中的数据来进行分析使用。

QT中使用Npcap lib 需要下载sdk 包和npcap 安装包。

Npcap: Windows Packet Capture Library & Driver

安装包直接下载后安装好就可以,相关的dll 会安装在系统文件夹下面

SDK 文件夹是里面我们会用到lib 和include 两个文件夹中的内容

 现在我们需要在自己的QT Project 中添加相关的头文件和lib:

我在自己的工程文件下有一个include /npcap 文件夹,把lib和include copy到里面 然后在QT的 .pro

文件中添加头文件和lib的路径。

  1. INCLUDEPATH += $$PWD/include/npcap/Include \
  2. $$PWD/include/npcap/Include/pcap
  3. LIBS += -L$$PWD/include/npcap/Lib/x64/ -lwpcap -lPacket
  4. LIBS += -lws2_32

然后我们可以按照example 中的例子来使用相关的API 函数实现自己的功能。

首先需要设置dll 的路径

  1. bool npcap::LoadNpcapDlls()
  2. {
  3. _TCHAR npcap_dir[512];
  4. u_int len;
  5. len = GetSystemDirectory(npcap_dir, 480);
  6. if (!len) {
  7. LOG(ERROR)<<"Error in GetSystemDirectory: %x", GetLastError();
  8. return FALSE;
  9. }
  10. _tcscat_s(npcap_dir,_T("\\Npcap"));
  11. if (SetDllDirectory(npcap_dir) == 0) {
  12. LOG(ERROR)<<"Error in SetDllDirectory: %x", GetLastError();
  13. return FALSE;
  14. }
  15. return true;
  16. }

 然后去。查找本机上的网卡:

  1. /* Retrieve the device list from the local machine */
  2. if (pcap_findalldevs(&alldevs, errbuf) == -1)
  3. {
  4. // fprintf(stderr, "Error in pcap_findalldevs_ex: %s\n", errbuf);
  5. LOG(ERROR)<<"Error in pcap_findalldevs_ex: %s\n", errbuf;
  6. return false;
  7. }
  8. /* Print the list */
  9. i=0;
  10. for (d = alldevs; d != NULL; d = d->next)
  11. {
  12. printf("%d. %s", ++i, d->name);
  13. // std::cout<<d->name;
  14. if (d->description)
  15. {
  16. printf(" (%s)\n", d->description);
  17. LOG(INFO)<<d->name <<" "<<d->description;
  18. }
  19. else
  20. printf(" (No description available)\n");
  21. }
  22. if (i == 0)
  23. {
  24. LOG(ERROR)<<"No interfaces found! Make sure Npcap is installed.";
  25. return false;
  26. }
  27. LOG(INFO)<<"EVERTHING IS OK";

log中显示的设备如下:

1. \Device\NPF_{6D1563EB-50E0-4120-8037-CCE642522B73} (Microsoft)
2. \Device\NPF_{9A940057-B2C2-4980-9170-886634C36850} (Microsoft)
3. \Device\NPF_{F95E1AB6-8332-4E32-84A3-814F0059022E} (TAP-Windows Adapter V9)
4. \Device\NPF_{DBDA1639-0D88-4DC4-A7AA-7DC7DCE89ABA} (Microsoft)
5. \Device\NPF_{081972C6-8EEF-4867-9D7B-EDC7D7403648} (Realtek PCIe GbE Family Controller)
6. \Device\NPF_{215630E1-4D9D-45B7-B69F-99E76F815248} (Microsoft)

再就是打开设备:

  1. /* Open the adapter */
  2. if ((adhandle= pcap_open_live(d->name, // name of the device
  3. 65536, // portion of the packet to capture.
  4. // 65536 grants that the whole packet will be captured on all the MACs.
  5. 1, // promiscuous mode (nonzero means promiscuous)
  6. 1000, // read timeout
  7. errbuf // error buffer
  8. )) == NULL)
  9. {
  10. fprintf(stderr,"\nUnable to open the adapter. %s is not supported by Npcap\n", d->name);
  11. /* Free the device list */
  12. pcap_freealldevs(alldevs);
  13. return false;
  14. }

 可以将抓取的数据保存到相关的文件中:

  1. /* Open the dump file */
  2. dumpfile = pcap_dump_open(adhandle, logFolder);
  3. if(dumpfile==NULL)
  4. {
  5. fprintf(stderr,"\nError opening output file\n");
  6. return false;
  7. }

然后开始抓取数据:

  1. /* start the capture */
  2. pcap_loop(adhandle, 0, packet_handler, (unsigned char *)dumpfile);

停止抓取:

  1. pcap_breakloop(adhandle);
  2. pcap_dump_close(dumpfile);
  3. pcap_close(adhandle);

以上就是使用npcap的一个简单过程,一些其它的用法可以参考sdk 里面的范例。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/162450
推荐阅读
相关标签
  

闽ICP备14008679号