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:UsersusrDocumentsCodeC++ Projectsstaticlibtinsincludetinsmacros.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:UsersusrDocumentsCodeC++ Projectsstaticlibtinsincludetinsconfig.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 ==========

我在他们的网站上唯一不明白的指令是当他们说

您还需要将此宏定义添加到项目中:

TINS_STATIC

我不完全知道这意味着什么,所以这也可能是问题所在。

提前感谢!

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

所有这些说明都基于链接。

在 Windows 上使用预编译的 libtins

  • 下载预编译的库。在此处选择所需的目标平台(调试/发布,32/64 位)。在右侧,单击"工件",然后下载zip存档。打开拉链。在里面你会发现一个include和一个lib文件夹。

  • 从此处下载 npcap SDK。解压缩压缩存档。在里面你会发现一个Include和一个Lib文件夹。请注意,lib 文件夹将 64 位变体作为子文件夹 (Lib/x64)。

  • 在 Visual Studio 中,打开项目设置。在顶部,确保配置/平台与所需的目标平台匹配(调试/发布,32/64 位)。

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

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

      • 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

      说明:这相当于在包含任何 libtins 标头之前在代码中添加#define TINS_STATIC。这将导致 libtins 在其标头中省略任何dllexport/dllimport语句,如果您将 libtins 用作共享/动态库而不是静态库,则需要这样做(有关更多信息,请参阅 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 位)。结果应类似于<some-path>libtins-vs2015-x64-releaselibtinslib;<some-path>npcap-sdk-1.05Libx64;%(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).

      说明:这将指示Visual Studio链接到libtins和npcap二进制文件以及必要的Windows网络库。如果没有这个,您会收到以下错误:

      • 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 标头之前添加#include <algorithm>

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

  • 您的代码现在应该编译了。但是,请注意,eth0是特定于 Linux 的接口名称。很有可能,它不会在Windows上为您提供任何输出。有关如何在 Windows 上识别网络接口名称的信息,请参阅此链接。所以与其eth0,你的名字应该是更长的{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX}形式。

在 Windows 上从源代码编译 libtins

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

  • 安装 cmake (链接)
  • 下载libtins源代码(链接),解压缩存档。
  • 像以前一样下载 npcap SDK。我没有尝试从源代码编译 npcap。
  • 在 libtins 源代码文件夹中,打开命令提示符。运行以下命令,将PCAP_ROOT_DIR调整到下载 npcap SDK 的位置。还要适应所需的配置(调试/发布)。
mkdir build
cd build
& 'C:Program FilesCMakebincmake.exe' ../ -DPCAP_ROOT_DIR=<some-path>npcap-sdk-1.05 -DLIBTINS_ENABLE_WPA2=0 -DLIBTINS_BUILD_SHARED=off -DCMAKE_BUILD_TYPE=Release
& 'C:Program FilesCMakebincmake.exe' --build . --config Release
  • .buildlibRelease下的 libtins 源文件夹中,您现在应该有一个tins.lib
  • 按照上面给出的Visual Studio说明进行操作,但将libtins的路径调整为自编译版本:
    • 对于"其他库目录",请使用例如<some-path>libtins-masterbuildlibRelease.
    • 对于"其他包含目录",请使用例如<some-path>libtins-masterinclude.

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

相关内容

  • 没有找到相关文章

最新更新