美文网首页
VS2019编译TCPDump/WinDump

VS2019编译TCPDump/WinDump

作者: whuangxm | 来源:发表于2020-01-03 13:47 被阅读0次

一、准备代码

TCPdumpGitHub 发行页面 下载最新版本,我下载的是 4.9.3 版。解压缩到某个路径(以 C:\Users\xxx\source\repos\tcpdump 为例。)

二、修正错误的头和库路径

初步编译旧版本的工程文件.\win32\prj\WinDump.sln,一路确定,重新编译。得到第一个错误是一堆:

fatal error C1083: 无法打开包括文件: “pcap.h”: No such file or directory

下载 WinPCAP4.1.3版本 及其 开发资源 4.1.2版本 解压到某个路径(以C:\Users\xxx\source\repos\WpdPack\Include为例)。将其路径(绝对路径或相对路径)添加到包含文件夹和库文件夹。

附加包含目录的内容可以为:

..\..\..\WpdPack\Include;..\..\;%(AdditionalIncludeDirectories)

附加库目录可以为:

..\..\..\WpdPack\Lib;%(AdditionalLibraryDirectories)
image image

三、修正工程文件

修改后,重新编译程序得到错误。

 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)
image

四、修正部分编译错误

修改后,重新编译程序,得到新的错误。主要是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\。

image

相关文章

网友评论

      本文标题:VS2019编译TCPDump/WinDump

      本文链接:https://www.haomeiwen.com/subject/anszoctx.html