目录
我的配置包,可以下载 ,直接在里面进行编写源代码,但编译器的头文件配置还是需要的
资源附件
0x01下载安装Npcap及其相关组件
在官网下在Npcap的SDK以及环境支持
Npcap: Windows Packet Capture Library & Driver
这里有四个文件
- Npcap 0.9997 installer for Windows 7/2008R2, 8/2012, 8.1/2012R2, 10/2016, 2019 (x86 and x64).
- Npcap SDK 1.05 (ZIP).
- Npcap 0.9997 debug symbols (ZIP).
- Npcap 0.9997 source code (ZIP).
- 第一个是安装环境,必要的环境安装,没有的话就会缺少驱动程序。该程序会向系统注入必要的静态链接库,这些库是程序索要调用的必要的程序;
- SDK是软件开发工具包,里面包含了Npcap网络编程所必要的头文件和动态链接库
- 第三个是调试符号包,提供了调试的符号集
- 第四个提供了Npcap开发的源代码,开发人员可以阅读它了解底层原理或者进行优化。
这里将这四个文件都下载下来
解压、安装
此处以个人安装方法进行介绍,原理是不变的
建立WinNetworkProgram
文件夹,以下操作均在该文件夹下进行
- 运行
npcap-0.9997.exe
安装Npcap,傻瓜式安装,不作介绍; - 将SDK的内容解压出来,放在
SDK
文件夹下; - 将源代码文件解压至
Source-code
文件夹下; - 将符号集解压至
DebugSymbols
文件夹下 - 建立
Project
文件夹,我们的项目在这个文件夹中展开 - 建立在
Project
文件夹下建立src
和bin
文件夹,src
存放你的源代码,bin
存放你的生成的可执行程序
C编译器对Npcap的支持
- 在后面vscode中的配置只能支持vscode的
C/C++
插件对你的源代码的智能提示和代码补全,但是编译的时候vscode其实是调用了定义好的系统命令,如果编译器不支持,还是会有问题。所以,需要将Npcap
的Include
文件夹内的头文件放在C编译器的include
中,让编译器能够找到该头文件 - Npcap中的
Include
文件夹包含4个*.h
文件和一个pcap
文件夹,这些内容一起拷贝: MInGW
的``include很多,我也不清楚都是干啥用的,为了保险起见,将上面说的那4个头文件和
pcap文件夹拷到
MinGW中所有的
include文件夹中 我放在了两个
nclude`中,包括:
MinGW\include\
MinGW\i686-w64-mingw32\include
本人水平实在有限,如果这样还是会报文件包含路径的错误的话,烦请大家及时指出,我会尽量测试更改,谢谢
0x02 vscode配置
vscode对于C、C++编译运行的基础环境配置
- 这部分在网络上资料很多,不作赘述,下载插件即可,建议安装
C/C++ Extension Pack
即可
vscode对Npcap编程的配置
- 将
Project
文件夹在vscode中打开,(打开文件夹) - 一般
C/C++
这个插件会自动建立配置供你进行编辑,如果没有,建立.vscode
文件夹,在里面创建c_cpp_properties.json
文件,并填写以下代码:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/..//SDK/Include/**",
"${workspaceFolder}/../SDK/Include",
"${workspaceFolder}/src/**",
"${workspaceFolder}/src"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "D:\\etc\\MinGW\\bin\\gcc.exe",
"cStandard": "gnu18",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-x64",
"compilerArgs": [
"-L${workspaceFolder}/../SDK/Lib",
"-lwpcap",
"-lPacket"
]
}
],
"version": 4
}
保存退出。
编写测试文件
在test.c
文件中写入如下代码:
#include "pcap.h"
#include <stdio.h>
int main()
{
char errbuf[PCAP_ERRBUF_SIZE];//存放错误信息的缓冲
pcap_if_t *it;
int r;
r=pcap_findalldevs(&it,errbuf);
if(r==-1)
{
printf("err:%s\n",errbuf);
exit(-1);
}
while(it)
{
printf(":%s\n",it->name);
it=it->next;
}
}
- 该程序打印出本机的所有网卡列表
测试
- 按F5对代码进行调试,首次调试会生成
launch.json
和task.json
文件,注意查看里面的参数内容和之前配置的c_cpp_properties.json
中的是否一样,即该部分
"compilerArgs": [
"-L${workspaceFolder}/../SDK/Lib/",
"-lwpcap",
"-lPacket"
]
一般来说,这个文件是根据c_cpp_properties.json
生成的,不会有大问题的。
- 生成该文件后,重新按F5进行调试运行。注意要调试运行才能调用动态链接库
- 控制台中有如下信息
Microsoft Windows [版本 10.0.19041.508]
(c) 2020 Microsoft Corporation. 保留所有权利。
D:\home\xxxx\WinNetworkProgram> cmd /C "c:\Users\xxx\.vscode\extensions\ms-vscode.cpptools-1.0.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-340uippl.fhl --stdout=Microsoft-MIEngine-Out-ekoupmwk.30e --stderr=Microsoft-MIEngine-Error-jpdvtcwn.bxf --pid=Microsoft-MIEngine-Pid-xdcenvcj.2rm --dbgExe=D:\etc\MinGW\bin\gdb.exe --interpreter=mi "
:\Device\NPF_{456C0DB7-9C02-48CE-BF9C-D0201D93A39B}
:\Device\NPF_{65EB5D2F-C7FD-4DAB-B591-042BF9295C9B}
:\Device\NPF_{D235884A-3C87-4777-9B9C-9AF186C3BADF}
即成功
Code-Runner运行配置
- 进入设置-工作区-扩展-Run Code Configuration,在
settings.json
中编辑Executor Map
项。 - 在
settings.json
编辑,将c
和cpp
对应的项改为如下内容:
"c": "cd $dir && gcc $fileName -o $workspaceRoot\\bin\\$fileNameWithoutExt -L$workspaceRoot\\..\\SDK\\Lib -lwpcap -lPacket && cd $workspaceRoot\\bin\\ && $fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $workspaceRoot\\bin\\$fileNameWithoutExt -L$workspaceRoot\\..\\SDK\\Lib -lwpcap -lPacket && cd $workspaceRoot\\bin\\ && $fileNameWithoutExt",
- 如此即可直接使用Code Runner的插件直接运行代码,为了不影响其他项目程序的编译过程,所以配置在工作空间中进行修改
- 这里的
$workspaceRoot
就是之前的配置中的${workspaceFloder}
- 开发的文件结构如下:
WinNetworkProgram
-
Project
- .vscode
- c_cpp_properties.json
- launch.json
- settings.json
- tasks.json
- src
- test.c
- bin
- test.exe
- .vscode
-
SDK
-
DebugSymbols
-
Source-code
采坑记录,根据编译器版本进行配置的调整
先贴上我的MinGW
的的buildinfo.txt
# **************************************************************************
version : MinGW-W64-builds-4.3.5
user : nixman
date : 05.12.2018-12:56:26 AM
args : --mode=gcc-8.1.0 --buildroot=/c/mingw810 --jobs=2 --rev=0 --rt-version=trunk --bootstrap --threads=posix --exceptions=sjlj --arch=i686 --bin-compress
PATH : /usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
CFLAGS : -O2 -pipe -fno-ident
CXXFLAGS: -O2 -pipe -fno-ident
CPPFLAGS:
LDFLAGS : -pipe -fno-ident
# **************************************************************************
- 重点在这里:
args
,里面有一项--arch=i686
,这表明了要使用x86
的库,即在上面的参数配置中,gcc
的-L
参数直接写Lib
文件夹就行,但是如果是这样
args : --mode=gcc-8.1.0 --buildroot=/c/mingw810 --jobs=2 --rev=0 --rt-version=trunk --bootstrap --threads=win32 --exceptions=seh --arch=x86_64 --bin-compress
--arch=x86_64
,即64位实现,在配置过程中,-L
参数应该指向Lib\x64
文件夹下,举例配置:
"compilerArgs": [
"-L${workspaceFolder}/../SDK/Lib/x64",
"-lwpcap",
"-lPacket"
]
"c": "cd $dir && gcc $fileName -o $workspaceRoot\\bin\\$fileNameWithoutExt -L$workspaceRoot\\..\\SDK\\Lib\\x64 -lwpcap -lPacket && cd $workspaceRoot\\bin\\ && $fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $workspaceRoot\\bin\\$fileNameWithoutExt -L$workspaceRoot\\..\\SDK\\Lib\\x64 -lwpcap -lPacket && cd $workspaceRoot\\bin\\ && $fileNameWithoutExt",
不同的
编译器版本会导致不同的问题,以下问题就是由于上述差异所导致。