實驗目的
目前的區域網基本上都採用以廣播為技術基礎的乙太網,任何兩個節點之間的通訊資料報,不僅為這兩個節點的網絡卡所接收,也同時為處在同一乙太網上的任何乙個節點的網絡卡所擷取。因此,黑客只要接入乙太網上的任一節點進行偵聽,就可以捕獲發生在這個乙太網上的所有資料報,對其進行解包分析,從而竊取關鍵資訊,這就是乙太網所固有的安全隱患。網上主要的免費黑客攻擊工具如satan、iss、netcat等均將乙太網偵聽作為基本的手段。
本實驗實現乙個區域網截包程式,目的在於使學生能更好地理解網路的工作機制(包括封包機制、協議分析等),該實驗是對《計算機網路》課程乙個有益的補充。
實驗內容
在乙個區域網環境中,用c 語言實現下面的基本功能:
(1)確定截包的方法:包括raw 模式socket、packet32以及直接作為驅動程式掛在ndis上
(2)要求截獲以下包的型別並分析:乙太網幀格式、ip包、icmp包、tcp報文段、udp報文等相關字段進行描述。
實驗步驟和注意事項
實驗按下述步驟進行:
(1)熟悉raw模式的socket程式設計
(2)熟悉packet32的工作機制
(3)熟悉windows 2000環境下ndis驅動程式的編寫方法
(4)編寫基於上述某一機制的區域網截包的實現程式;
(5)在模擬實現環境下除錯並執行自己編寫的協議實現程式;
(6)如出現異常情況,在實驗報告中記錄並分析可能的原因
#define rcvall_on 1
#define max_addr_len 16 //點分十進位制位址的最大長度
#define max_proto_text_len 16 //子協議名稱(如"tcp")最大長度
#define winsock_version makeword(2, 2)
#pragma comment(lib, "ws2_32.lib")
#include
#include
#include
#include
typedef struct iphdr //定義ip首部
ipheader;
typedef struct _tcphdr //定義tcp首部
tcp_header;
typedef struct _udphdr //定義udp首部
udp_header;
typedef struct _icmphdr //定義icmp首部
icmp_header;
int ittl,ilen,ibytes;
char szsourceip[max_addr_len], szdestip[max_addr_len];
int isourceport,idestport;
int fflag=0;//file flag
#define package_size sizeof(ipheader)+1000
void handleerror(char *func);
//functions
int decodetcppack(char *, int,file *); //tcp解包函式
int decodeu***ack(char *, int,file *); //udp解包函式
int decodeicmppack(char *, int,file *); //icmp解包函式
//main
int main(int argc, char *argv)
//獲取本機ip位址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
//addr.sin_addr.s_un.s_addr = inet_addr("192.168.1.101");
char name[256];
phostent hostinfo;
if( gethostname ( name, sizeof(name)) == 0)
} addr.sin_family = af_inet;
if(bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == socket_error)//bind
//設定sock_raw為sio_rcvall,以便接收所有的ip包
int on = rcvall_on;
dword num;
if(wsaioctl(sock, sio_rcvall, &on, sizeof(on), null, 0, &num, null, null) == socket_error)
struct sockaddr_in from;
int fromlen;
int size;
file *fp;
if((fp=fopen("log.txt","w+"))==null)
//偵聽ip報文
while(!kbhit())
} ipheader *iph=(ipheader *)buf;
/**/
//源位址
sasource.sin_addr.s_addr = iph->sourceip;
strncpy(szsourceip, inet_ntoa(sasource.sin_addr), max_addr_len);
//目的位址
sadest.sin_addr.s_addr = iph->destip;
strncpy(szdestip, inet_ntoa(sadest.sin_addr), max_addr_len);
ittl = iph->ttl;
//計算ip首部的長度
int ipheadlen = 4 * (iph->h_lenver & 0xf);
//根據協議型別分別呼叫相應的函式
switch(iph->proto)
//end switch
sleep(200);
}//end while
fclose(fp);
closesocket(sock);
wsacleanup();
printf("stopped!/n");
getch();
return 0;
}//end of main
//tcp解包程式
int decodetcppack(char * tcpbuf, int ibufsize,file *fp)
printf(" bytes=%4d", ibufsize);
printf("/n");
if(fflag=1)//寫入檔案
fprintf(fp,"tcp %15s:%5d ->%15s:%5d ttl=%3d ------ bytes=%4d/n"
,szsourceip, isourceport, szdestip, idestport, ittl,ibufsize);
return 0; }
//udp解包程式
int decodeu***ack(char * udpbuf, int ibufsize,file *fp)
//icmp解包程式
int decodeicmppack(char * icmpbuf, int ibufsize,file *fp)
void handleerror(char *func) ;
_snprintf(info, 64, "%s: %d/n", func, wsagetlasterror());
printf(info); }
區域網YUM安裝RPM包
linux初學者 剛開始接觸rpm 包的時候都對他的依賴關係頭疼。學會了用 yum來解決依賴關係是件好事,但是當我們的 linux 系統沒有聯網的情況下怎麼辦呢?是否也可以做到自動安裝呢 當然是有辦法的。一 首先將光碟的rpm 包都拷貝到硬碟裡面,目錄,我放到 var ftp rpm 下,這樣能讓別...
區域網UDP丟包優化
之前一直沒考慮清楚為何接收到udp資料丟包的問題,當意識到這造成很大問題時便狂查資料,有以下結論 1.傳送方傳送的資料太快,導致udp輸入佇列溢位 系統會丟掉一些包 在應用程式看來是即是丟包。解決方法 1.想辦法提高應用程式對udp包的處理速度。2.提高udp輸入佇列緩衝區大小,可通過setsock...
python攻擊區域網電腦 區域網攻擊
目錄 區域網內的欺騙攻擊主要有以下幾種 arp欺騙 dns欺騙 netbios名稱欺騙和llmnr欺騙 進行內網攻擊的第一步是先檢視我們自己網絡卡的配置資訊,從而得知內網網段的資訊。探測內網資訊 檢視自己網絡卡配置資訊有好多命令,常用的有下面幾個,我們主要是檢視ip 子網掩碼和閘道器資訊 nmcli...