#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.lib
、wpcap.lib
和 Windows 库Iphlpapi.lib
、Ws2_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 命令应该告诉您已启用哪些功能。