libtins 嗅探器未定义

libtins Sniffer undefined

#include <iostream>
#include <tins/tins.h>

using namespace Tins;
using namespace std;

bool callback(const PDU& pdu) {
    // Find the IP layer
    const IP& ip = pdu.rfind_pdu<IP>();
    // Find the TCP layer
    const TCP& tcp = pdu.rfind_pdu<TCP>();
    cout << ip.src_addr() << ":" << tcp.sport() << " -> "
         << ip.dst_addr() << ":" << tcp.dport() << endl;
    return true;
}

int main() {
    Sniffer("eth0").sniff_loop(callback);
}

我有 libtins 给你的默认代码,但由于某些原因 Sniffer 未定义。我已将所有库包含在我的链接器中。

在构建时它还给我以下错误:

-- Build started: Project: Packet Sniffing, Configuration: Debug x64 ------
1>Packet Sniffing.cpp
1>C:\Users\usr\Documents\Code\C++ Projects\static\libtins\include\tins\macros.h(37,10): fatal error C1083: Cannot open include file: 'tins/config.h': No such file or directory
1>Done building project "Packet Sniffing.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我检查过,没有名为 config.h 的文件,但有一个名为 config.h.in 的文件。当我删除 .in 时,它给了我另一个错误:

1>------ Build started: Project: Packet Sniffing, Configuration: Debug x64 ------
1>Packet Sniffing.cpp
1>C:\Users\usr\Documents\Code\C++ Projects\static\libtins\include\tins\config.h(5,1): fatal error C1021: invalid preprocessor command 'cmakedefine'
1>Done building project "Packet Sniffing.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我在 their website 上唯一不明白的是他们说

You also need to add this macro definition to your project:

TINS_STATIC

我不太清楚这是什么意思,所以这也可能是问题所在。

提前致谢!

这里是在 Windows 上使用 libtins 的说明。您可以使用 pre-compiled 库或自己编译 libtins。如果您不确定,我建议您使用 pre-compiled 版本的 libtins,因为它的工作更少。

所有这些说明都基于link

在 Windows

上使用 pre-compiled libtins
  • 下载 pre-compiled libtins。 Select 您所需的目标平台 here(debug/release,32/64 位)。在右侧,单击 "Artifacts",然后下载 zip 存档。打开拉链。在里面你会发现一个 include 和一个 lib 文件夹。

  • here 下载 npcap SDK。解压缩 zip 存档。在里面你会发现一个 Include 和一个 Lib 文件夹。请注意,lib 文件夹具有 64 位变体 sub-folder (Lib/x64)。

  • 在 Visual Studio 中,打开您的项目设置。在顶部,确保 configuration/platform 匹配您所需的目标平台(debug/release,32/64 位)。

    • C/C++ > General > Additional include directories下添加libtins和npcap的include目录。例如。它应该看起来像 <some-path>\libtins-vs2015-x64-release\libtins\include;<some-path>\npcap-sdk-1.05\Include;%(AdditionalIncludeDirectories).

      说明:没有这个,Visual Studio将无法找到libtins和npcap的headers。您会收到如下错误:

      • E1696 cannot open source file "tins/tins.h"
      • E0020 identifier "PDU" is undefined
      • E1696 cannot open source file "pcap.h"
      • E0020 identifier "pcap_t" is undefined
    • C/C++ > Preprocessor > Preprocessor definitions 下,添加 TINS_STATIC

      说明:这相当于在您的代码中添加 #define TINS_STATIC,然后再包含任何 libtins headers。这将导致 libtins 省略其 headers 中的任何 dllexport/dllimport 语句,如果您将 libtins 用作 shared/dynamic 库而不是静态库,则需要这样做库(有关更多信息,请参阅 link, link,在 libtins 源代码中,include/tins/macros.h 了解如何使用 TINS_STATIC)。没有这个你会得到这样的错误:

      • C4251 'Tins::DNS::records_data_': class 'std::vector<uint8_t,std::allocator<uint8_t>>' needs to have dll-interface to be used by clients of class 'Tins::DNS'
      • LNK2001 unresolved external symbol "__declspec(dllimport) public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
    • Linker > General > Additional library directories下添加libtins和npcap的lib目录。根据您的目标平台,为 npcacp(32/64 位)选择正确的 lib 目录。结果应该类似于 <some-path>\libtins-vs2015-x64-release\libtins\lib;<some-path>\npcap-sdk-1.05\Lib\x64;%(AdditionalLibraryDirectories).

      说明:如果没有这个,Visual Studio 将无法找到 libtins 和 npcap 库。您会收到如下错误:

      • LNK1181 cannot open input file 'tins.lib'
      • LNK1181 cannot open input file 'Packet.lib'
    • Linker > Input > Additional dependencies 下,添加 tins.lib,npcap 库 Packet.libwpcap.lib ,以及 Windows 个库 Iphlpapi.libWs2_32.lib。结果应该类似于 tins.lib;Packet.lib;wpcap.lib;Iphlpapi.lib;Ws2_32.lib;%(AdditionalDependencies).

      说明:这将针对 libtins 和 npcap 二进制文件以及必要的 Windows 网络库将 Visual Studio 定向到 link。没有这个,你会得到如下错误:

      • LNK2001 unresolved external symbol "public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
      • LNK2001 unresolved external symbol pcap_lookupnet
      • LNK2001 unresolved external symbol GetAdaptersAddresses
      • LNK2001 unresolved external symbol __imp_inet_pton
    • 在您的源代码中,确保在包含任何 libtins headers.

      之前添加 #include <algorithm>

      解释:没有这个我得到 C2039 'min': is not a member of 'std'.

  • 您的代码现在应该可以编译了。但是,请注意 eth0 是一个 Linux-specific 接口名称。十有八九,它不会在 Windows 上给你任何输出。关于如何识别 Windows 上的网络接口名称,请参阅此 link。所以你的名字应该是 {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX}.

  • 这样更长的名字,而不是 eth0

从 Windows

上的源代码编译 libtins

作为先决条件,您应该知道如何使用命令提示符。

  • 安装 cmake (link)
  • 下载 libtins 源代码 (link),解压缩存档。
  • 像以前一样下载npcap SDK。我也没有尝试从源代码编译 npcap。
  • 在 libtins 源代码文件夹中,打开命令提示符。 运行 以下命令,将 PCAP_ROOT_DIR 调整为您下载 npcap SDK 的位置。也适应你想要的配置(debug/release).
mkdir build
cd build
& 'C:\Program Files\CMake\bin\cmake.exe' ../ -DPCAP_ROOT_DIR=<some-path>\npcap-sdk-1.05\ -DLIBTINS_ENABLE_WPA2=0 -DLIBTINS_BUILD_SHARED=off -DCMAKE_BUILD_TYPE=Release
& 'C:\Program Files\CMake\bin\cmake.exe' --build . --config Release
  • .\build\lib\Release 下的 libtins 源文件夹中,您现在应该有一个 tins.lib.
  • 按照上面给出的 Visual Studio 的说明进行操作,但将 libtins 的路径调整为您的 self-compiled 版本:
    • 对于"Additional library directories",使用例如<some-path>\libtins-master\build\lib\Release.
    • 对于"Additional include directories",使用例如<some-path>\libtins-master\include.

请注意,这不会启用 libtins 的所有功能。为此,您需要安装额外的依赖项(openssl、boost)。第一个 cmake 命令应该会告诉您哪些功能已启用。