區域網截包程式設計

2021-04-14 08:30:44 字數 3818 閱讀 1757

實驗目的

目前的區域網基本上都採用以廣播為技術基礎的乙太網,任何兩個節點之間的通訊資料報,不僅為這兩個節點的網絡卡所接收,也同時為處在同一乙太網上的任何乙個節點的網絡卡所擷取。因此,黑客只要接入乙太網上的任一節點進行偵聽,就可以捕獲發生在這個乙太網上的所有資料報,對其進行解包分析,從而竊取關鍵資訊,這就是乙太網所固有的安全隱患。網上主要的免費黑客攻擊工具如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...