WinAPI 網路監聽程式的開發步驟(sniff)

2021-05-22 05:09:21 字數 2492 閱讀 4360

老婆大人今天和他們同事們打羽毛球去了,閒著沒事把這兩天使用winapi做的乙個網路抓包監聽的程式步驟整理一下:

我的程式參考了《visual c++網路通訊程式設計實用案例精選》這本書裡的乙個例子。

方法:#pragma comment(lib,"wsock32.lib")

#pragma comment(lib,"comctl32.lib")

或者在build-》setting-》link裡新增

2、定義ip,tcp,udp協議頭,這個到處有,copy乙個就行了:

typedef struct _ipheader ipheader;

#define udp_head_len 8

#define pseudo_head_len 12

#define icmp_head_len 4

struct tcppackethead ;

struct icmppackethead ;

struct u***ackethead ;

wsastartup(makeword(2,2), &wsadata);

if(gethostname(szhostname,128) == 0)

else

::messagebox(null, "phost = null", "gethostbyname", mb_ok);

}else

::messagebox(null, "szhostname = null", "gethostname", mb_ok);

dword dwsize = 0 ;

getipaddrtable( null , &dwsize, false ) ;

pmib_ipaddrtable pipaddrtable = (pmib_ipaddrtable )new byte [ dwsize ] ;

if( pipaddrtable )}}

delete pipaddrtable ;}}

5、建立原始套接字(raw),在這裡我都去掉了對返回值的判斷,實際應用應該加上

g_sockfd = socket(af_inet,sock_raw,ipproto_ip);

6、設定套接字的各種屬性:

int rcvtimeout = 5000;

if(setsockopt(g_sockfd,sol_socket,so_rcvtimeo,(const char *)&rcvtimeout,sizeof(rcvtimeout)) == socket_error)

sa.sin_family = af_inet;

sa.sin_port = htons(monitor_port);

sa.sin_addr.s_addr = g_iphostsource;

if(bind(g_sockfd,(psockaddr)&sa,sizeof(sa)) == socket_error)

if(socket_error != wsaioctl(g_sockfd,sio_rcvall,&dwbufferinlen,sizeof(dwbufferinlen),&dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,null,null))

else

{dwerr = wsagetlasterror();

sprintf(szerr,"error wsaioctl() = %ld ",dwerr);

::messagebox(null, szerr, "wsaioctl", mb_ok);

closesocket(g_sockfd);

return -1;

其中比較重要需要注意的就是sin_port 要設定成特定的埠,sa.sin_addr.s_addr 必須是本機乙個網絡卡的ip位址而不能是any,

wsaioctl(g_sockfd,sio_rcvall,&dwbufferinlen,sizeof(dwbufferinlen),&dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,null,null))這句話是將選中網絡卡設定為混雜模式,因為只有在混雜模式下網絡卡才可以將發到本埠而不是發給本機的網路包(我稱之為路過的包)收到協議棧裡。

7、到此,準備工作基本做好了,下面就可以建立乙個執行緒阻塞著收網路包了,收到之後就可以進行你想進行的分析處理了,收包方式:

memset( buf , 0 , sizeof(buf) ) ;

iret =  recv( g_sockfd , buf , sizeof( buf ) , 0 ) ;

我們常見的監聽程式sniff基本上就是上面的做法了,還有一種就是使用winpcap處理的監聽了,著名的etheral軟體和linux下的tcpdump就是採用的libcap做的,本人有時間的話會去了解一下。

我在編寫這個程式時用到了combobox,listbox等控制項來顯示,控制等,都是用api處理的,有時間我打算把這些控制項的用法總結一下,以便以後查詢方便,因為本人主要是做嵌入式系統下程式設計的人(如vxworks,linux),windows用的少,容易忘,呵呵,好了,今天就寫到這裡了。

IOS開發 網路監聽以及網路狀態更改

2.在需要使用檔案中匯入標頭檔案 引入標頭檔案 import reachability.h inte ce sfbaseviewcontroller 宣告屬性 property nonatomic,strong reachability hostreachability end 3.定義預設位址 位...

Android的網路狀態監聽

1 獲取當前網路資訊 想要獲取當前的網路資訊,就得獲取connectivitymanager,呼叫connectivitymanager的getactivenetworkinfo 方法,返回乙個networkinfo物件。這個networkinfo物件中的gettypename 方法,會返回當前的網...

Android 監聽網路的變化

android中網路情況時有變化,比如從有網到沒網,從wifi到gprs,gprs又從cmwap到cmnet.等等!如果你的程式有些功能是需要網路支援的,有時候就需要監聽到網路的變化情況進行相應的處理。當網路變化的時候系統會發出義個廣播broadcast,只要在程式中註冊乙個廣播接收器broadca...