一、准备代码
在 TCPdump 的 GitHub 发行页面 下载最新版本,我下载的是 4.9.3 版。解压缩到某个路径(以 C:\Users\xxx\source\repos\tcpdump
为例。)
二、修正错误的头和库路径
初步编译旧版本的工程文件.\win32\prj\WinDump.sln,一路确定,重新编译。得到第一个错误是一堆:
fatal error C1083: 无法打开包括文件: “pcap.h”: No such file or directory
下载 WinPCAP 的 4.1.3版本 及其 开发资源 4.1.2版本 解压到某个路径(以C:\Users\xxx\source\repos\WpdPack\Include
为例)。将其路径(绝对路径或相对路径)添加到包含文件夹和库文件夹。
附加包含目录的内容可以为:
..\..\..\WpdPack\Include;..\..\;%(AdditionalIncludeDirectories)
附加库目录可以为:
..\..\..\WpdPack\Lib;%(AdditionalLibraryDirectories)
![](https://img.haomeiwen.com/i10234835/6d8b691460307bd6.jpg)
![](https://img.haomeiwen.com/i10234835/a93cddbd8aecd2e1.jpg)
三、修正工程文件
修改后,重新编译程序得到错误。
fatal error C1083: 无法打开源文件: “..\..\util.c”: No such file or directory
选择该文件项,右键,选择【从项目中排除 (<u style="text-decoration: none; border-bottom: 1px dashed grey;">J</u>)】。
重新编译后的错误为:
1>print-tcp.obj : error LNK2019: 无法解析的外部符号 _resp_print,该符号在函数 _tcp_print 中被引用
1>print-udp.obj : error LNK2019: 无法解析的外部符号 _hncp_print,该符号在函数 _udp_print 中被引用
1>print-udp.obj : error LNK2019: 无法解析的外部符号 _lisp_print,该符号在函数 _udp_print 中被引用
1>print-udp.obj : error LNK2019: 无法解析的外部符号 _vxlan_gpe_print,该符号在函数 _udp_print 中被引用
此时应添加print-resp.c、print-hncp.c、print-lisp.c和print-vxlan-gpe.c到项目中(拖动比较快)。重新编译后又出现一些类似错误,应添加netdissect.c和print-nsh.c。
为了使得相关函数可用,修正以下类似错误:
error LNK2019: 无法解析的外部符号 __imp__getnameinfo@28,该符号在函数 _win32_gethostbyaddr 中被引用
建议附加依赖项添加Ws2_32.lib,改为:
wpcap.lib;Ws2_32.lib;%(AdditionalDependencies)
![](https://img.haomeiwen.com/i10234835/94a4b14eb62e57df.jpg)
四、修正部分编译错误
修改后,重新编译程序,得到新的错误。主要是tcpdump.c和print.c的。
tcpdump.c(174,78): error C2055: 应输入形参表,而不是类型表
print.c(234,23): error C2085: “ndo_warning”: 不在形参表中
主要是宏NORETURN展开后不符合Visual Studio 2019的C语法,具体地修改funcattrs.h
,第83行:
#define NORETURN __declspec(noreturn)
应改为:
#define NORETURN // __declspec(noreturn)
再次编译后得到错误:
tcpdump.obj : error LNK2019: 无法解析的外部符号 _pcap_wsockinit,该符号在函数 _main 中被引用
util-print.obj : error LNK2019: 无法解析的外部符号 _isascii,该符号在函数 _fetch_token 中被引用
由于WinPCAP版本比LibPCAP旧,有些函数在WinPCAP找不到。好在初始化Socket的函数容易恢复。在tcpdump.c的第1100行添加以下函数:
static int
pcap_wsockinit() //初始化sock
{
WSADATA wsaData;
int err;
err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err != 0) {
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
WSACleanup();
return 1;
}
return 0;
}
对于isascii的问题,是Windows函数名不同的问题,在util-print.c的706行之前添加:
#define isascii __isascii
直到在生成时遇到以下信息即为生成成功。
1>WinDump.vcxproj -> C:\Users\xxx\source\repos\tcpdump\win32\prj\.\Debug\WinDump.exe
1>已完成生成项目“WinDump.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
五、修改生成路径
这样生成的程序无法调试,此时应将输出目录改为.\Debug\。
![](https://img.haomeiwen.com/i10234835/c751eaa2b51f4e63.jpg)
网友评论