windows下編譯snort
編譯環境WIN10-x64,VS2013+Cygwin(要安裝bison、flex、sed)
從snort官網上下載 daq-2.0.6.tar.gz\snort-2.9.11.1.tar.gz
https://www.snort.org/downloads#snort-downloads
分別解壓,並將daq-2.0.6重新命名為daq並放在snort的第一層資料夾中
用VS2013開啟snort.dsw
snort-2.9.11.1\src\win32\WIN32-Prj(目錄)
先編譯daq報如下錯誤
修改如下
再次編譯daq,報如下錯誤
此時是因為VS2013自帶的系統檔案in6addr.h
(路徑C:\Program Files (x86)\Windows Kits\8.1\Include\shared)
的聯合體成員數不夠
修改如下
再次編譯daq,還是出錯
修改方法(步驟有點多,請仔細看)
右鍵daq的屬性 新增VC++目錄—>包含目錄
$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\..\;$(SolutionDir)..\..\sfutil\;$(SolutionDir)..\..\..\daq\api\;
再在daq_common.h中引入 #include “sf_ip.h” 如下圖所示
進入sf_ip.h檔案加入
#ifdefined(WIN32) && !defined(__cplusplus) && !defined(inline)
#define inline__inline
#endif
如下圖所示
再次編譯daq專案,成功如下圖
先編譯一下dynamic_preprocessors 會生成一些預設目錄(接下來會用到,不編譯就不會有include目錄)
將reload_api.h 從\snort-2.9.11.1\src\ 複製到\snort-2.9.11.1\src\dynamic-preprocessors\include\ 目錄中
將sfmemcap.h/sfmemcap.c 從\snort-2.9.11.1\src\sfutil\ 複製到\snort-2.9.11.1\src\dynamic-preprocessors\include\ 之後修改\include\sfmemcap.c檔案內容,註釋#include”util.h”
將 reg_test.h/reg_test.c 從\snort-2.9.11.1\src\ 複製到 \snort-2.9.11.1\src\dynamic-preprocessors\include\ 目錄中
修改\snort-2.9.11.1\src\dynamic-preprocessors\dcerpc2\spp_dce2.c檔案如下圖所示
修改\snort-2.9.11.1\src\dynamic-preprocessors\include\sf_dynamic_preprocessor.h檔案
及
\snort-2.9.11.1\src\dynamic-plugins\sf_dynamic_preprocessor.h檔案 (相同的檔案)
成下圖所示
修改\snort-2.9.11.1\src\win32\WIN32-Includes\config.h檔案如下圖所示
將\snort-2.9.11.1\src\ 中的 reload.c/.h和pkt_tracer.c/.h新增到snort專案中
並修改pkt_tracer.c 檔案
新增
/*inet_ntop*/
staticconstchar*
inet_ntop_v4(constvoid*src,char*dst,size_tsize)
{
constchardigits[]="0123456789";
inti;
structin_addr*addr=(structin_addr*)src;
u_longa=ntohl(addr->s_addr);
constchar*orig_dst=dst;
if(size<INET_ADDRSTRLEN){
errno=ENOSPC;
returnNULL;
}
for(i=0;i<4;++i){
intn=(a>>(24-i*8))&0xFF;
intnon_zerop=0;
if(non_zerop||n/100>0){
*dst++=digits[n/100];
n%=100;
non_zerop=1;
}
if(non_zerop||n/10>0){
*dst++=digits[n/10];
n%=10;
non_zerop=1;
}
*dst++=digits[n];
if(i!=3)
*dst++='.';
}
*dst++='\0';
returnorig_dst;
}
#ifdefHAVE_IPV6
staticconstchar*
inet_ntop_v6(constvoid*src,char*dst, size_t size)
{
constchar xdigits[]="0123456789abcdef";
int i;
conststruct in6_addr *addr =(struct in6_addr *)src;
const u_char *ptr = addr->s6_addr;
constchar*orig_dst = dst;
int compressed =0;
if(size < INET6_ADDRSTRLEN){
errno = ENOSPC;
return NULL;
}
for(i =0; i <8;++i){
int non_zerop =0;
if(compressed ==0&&
ptr[0]==0&& ptr[1]==0&&
i <=5&&
ptr[2]==0&& ptr[3]==0&&
ptr[4]==0&& ptr[5]==0){
compressed =1;
if(i ==0)
*dst++=':';
*dst++=':';
for(ptr +=6, i +=3;
i <8&& ptr[0]==0&& ptr[1]==0;
++i, ptr +=2);
if(i >=8)
break;
}
if(non_zerop ||(ptr[0]>>4)){
*dst++= xdigits[ptr[0]>>4];
non_zerop =1;
}
if(non_zerop ||(ptr[0]&0x0F)){
*dst++= xdigits[ptr[0]&0x0F];
non_zerop =1;
}
if(non_zerop ||(ptr[1]>>4)){
*dst++= xdigits[ptr[1]>>4];
non_zerop =1;
}
*dst++= xdigits[ptr[1]&0x0F];
if(i !=7)
*dst++=':';
ptr +=2;
}
*dst++='\0';
return orig_dst;
}
#endif/* HAVE_IPV6 */
constchar*
inet_ntop(intaf,constvoid*src,char*dst,size_tsize)
{
switch(af){
caseAF_INET:
returninet_ntop_v4(src,dst,size);
#ifdefHAVE_IPV6
case AF_INET6:
return inet_ntop_v6(src, dst, size);
#endif
default:
errno=EAFNOSUPPORT;
returnNULL;
}
}
/*inet_ntop end*/
到如下位置
此處省略了幾步,具體的步驟可在資源中下載完整的筆記!
編譯好的snort.exe
完整筆記前往
https://download.csdn.net/download/feixi7358/10327433
下載
想要編譯好的原始碼,可以前往
https://download.csdn.net/download/feixi7358/10327554 下載
想要編譯好的snort.exe,可前往https://download.csdn.net/download/feixi7358/10327445下載