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.lib
,wpcap.lib
,以及 Windows 个库 Iphlpapi.lib
、Ws2_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 命令应该会告诉您哪些功能已启用。
#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.lib
,wpcap.lib
,以及 Windows 个库Iphlpapi.lib
、Ws2_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
.
- 对于"Additional library directories",使用例如
请注意,这不会启用 libtins 的所有功能。为此,您需要安装额外的依赖项(openssl、boost)。第一个 cmake 命令应该会告诉您哪些功能已启用。