《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 在Linux下利用C語言來實現(xiàn)一個Sniffer的方法簡介
在Linux下利用C語言來實現(xiàn)一個Sniffer的方法簡介
摘要: 在這篇文章里,我們主要探討在Linux下如何利用C語言來實現(xiàn)一個Sniffer!我們將假設(shè)所有的主機在一個局域網(wǎng)內(nèi)。
關(guān)鍵詞: 軟件 Linux C語言
Abstract:
Key words :

 

 

Sniffer技術(shù)是網(wǎng)絡(luò)安全領(lǐng)域里一項非常重要的技術(shù)!對于“Hacker”來說,他們可以以非常隱蔽的方式得到網(wǎng)絡(luò)中傳輸?shù)拇罅康拿舾行畔?,?Telnet,ftp帳號和密碼等等明文傳送的信息!與主動掃描相比,嗅探的行為更加難以被察覺,操作起來也不是很復(fù)雜!對于網(wǎng)絡(luò)管理人員來說,可以利用嗅探技術(shù)對網(wǎng)絡(luò)活動進行監(jiān)控,并及時發(fā)現(xiàn)各種攻擊行為!

 

在這篇文章里,我們主要探討在Linux下如何利用C語言來實現(xiàn)一個Sniffer!我們將假設(shè)所有的主機在一個局域網(wǎng)內(nèi)。

首先,我們將簡短的回顧一下一個普通的以太網(wǎng)卡是怎么工作的!(如果你對這方面的知識早已熟悉,那么你可以直接跳到下一段)來源于應(yīng)用程序的IP報文被封裝成以太網(wǎng)幀(這是在以太網(wǎng)上傳播的數(shù)據(jù)報文的名稱),它是底層鏈路層報文上面的一層報文,包含有源地址報文和一些需要用來傳送至目標主機的信息。通常情況下,目的IP地址對應(yīng)著一個6字節(jié)的目的以太網(wǎng)址(經(jīng)常叫做MAC地址),它們之間通過ARP協(xié)議進行映射!就這樣,包含著以太網(wǎng)幀的報文從源主機傳輸?shù)侥康闹鳈C,中間經(jīng)過一些網(wǎng)絡(luò)設(shè)備,如交換機,路由器等等,當(dāng)然,因為我們的前提是主機在同一網(wǎng)內(nèi),所以我們的討論不涉及以上這些網(wǎng)絡(luò)設(shè)備!

在鏈路層中并不存在路線的概念,換句話說,源主機發(fā)出的幀不會直接指向目的主機,而是基于廣播方式傳播,網(wǎng)絡(luò)中的所有網(wǎng)卡都能看到它的傳輸。每個網(wǎng)卡會檢查幀開始的6個字節(jié)(目的主機的MAC地址),但是只有一個網(wǎng)卡會發(fā)現(xiàn)自己的地址和其相符合,然后它接收這個幀,這個幀會被網(wǎng)絡(luò)驅(qū)動程序分解,原來的IP 報文將通過網(wǎng)絡(luò)協(xié)議棧傳送至接收的應(yīng)用程序!

更準確的說,網(wǎng)絡(luò)驅(qū)動程序會檢查幀中報文頭部的協(xié)議標識,以確定接收數(shù)據(jù)的上層協(xié)議!大多數(shù)情況下,上層是IP協(xié)議,所以接收機制將去掉IP報文頭部,然后把剩下的傳送至UDP或者TCP接收機制!這些協(xié)議,將把報文送到SOCKET-handling機制,它將最后把報文數(shù)據(jù)變成應(yīng)用程序可接收的方式發(fā)送出去。在這個過程中,報文將失去所有的和其有關(guān)的網(wǎng)絡(luò)信息,比如源地址(IP和MAC),端口號,IP選擇,TCP參數(shù)等等!所以如果目的主機沒有一個包含正確參數(shù)的打開端口,那么這個報文將被丟棄而且永遠不會被送到應(yīng)用層去!

因此我們在進行網(wǎng)絡(luò)嗅探的時候有兩個不同的問題:一個和以太網(wǎng)址有關(guān),我們不能抓到不是發(fā)給自己主機的包,另一個和協(xié)議棧的運行過程有關(guān),我們需要一個socket去*每個端口,得到那些沒有被丟棄的報文!

第一個問題不是最根本的,因為我們可能不會對發(fā)往其他主機的報文有興趣而只想嗅探所有發(fā)往自己主機的報文。第二個問題是必須要解決的,下面我們將看到這個問題是怎么樣一步一步解決的!

當(dāng)你打開一個標準的SOCKET套接字時,你需要指明你將使用哪個協(xié)議簇,大多數(shù)情況下我們一般用PF_UNIX在本地機器間進行通信,PF_INET在基于IPv4協(xié)議簇基礎(chǔ)之上進行通信,你還需要指明所用的協(xié)議類型及與協(xié)議簇相關(guān)的確切數(shù)值,,在PF_INET協(xié)議簇中,常用的有 SOCK_STREAM(與TCP相關(guān)),SOCK_DGRAM(與UDP相關(guān))。在把報文發(fā)送到應(yīng)用程序前內(nèi)核對其的處理與SOCKET類型有關(guān),你指定的協(xié)議將處理報文在SOCKET的傳輸!(具體細節(jié)問題你可以man socket(3))

在LINUX內(nèi)核版本中(2.0 releases),一個名為PF_PACKET的協(xié)議簇被加了進來!這個簇允許應(yīng)用程序直接利用網(wǎng)絡(luò)驅(qū)動程序發(fā)送和接收報文,避免了原來的協(xié)議棧處理過程,在這種情況下,所有SOCKET發(fā)出的報文直接送到以太網(wǎng)卡接口,而接口收到的任何報文將直接送到應(yīng)用程序The PF_PACKET協(xié)議簇支持兩個稍微有點不同的SOCKET類型,SOCK_DGRAM和SOCK_RAW。

前者讓內(nèi)核處理添加或者去除以太網(wǎng)報文頭部工作,而后者則讓應(yīng)用程序?qū)σ蕴W(wǎng)報文頭部有完全的控制!在SOCKET調(diào)用中的協(xié)議類型必須符合/usr /include/linux/if_ether.h中定義的以太網(wǎng)IDs中的一個,除非遇到特別聲明的協(xié)議,一般你可以用ETH_P_IP來處理IP的一組協(xié)議(TCP,UDP,ICMP,raw IP等等)因為它們?nèi)菀资艿揭恍┖車乐氐陌踩珕栴}的牽連(比如你可以偽造一個MAC地址),所以只有具有root權(quán)限才可以使用PF_PACKET- familysocket.這也就是為什么只有具有root權(quán)限后才能運行嗅探器的原因!

PF_PACKET-family 協(xié)議簇可以很容易解決協(xié)議棧處理嗅探來的數(shù)據(jù)報文時候遇到的問題!我們一起來看看程序1,我們打開一個屬于PF_PACKET-family 協(xié)議簇的SOCKET,指定一個SOCK_RAW socket類型和IP相關(guān)協(xié)議類型。這時我們開始從SOCKET抓包,在一些相關(guān)檢查后.我們開始得到從鏈路層和IP層抓來的頭部信息,。通過閱讀程序一,你將會發(fā)現(xiàn)讓應(yīng)用程序從網(wǎng)絡(luò)層抓包其實并不難!

Example 1.

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv) {

int sock, n;

char buffer[2048];

unsigned char *iphead, *ethhead;

if ( (sock=socket(PF_PACKET, SOCK_RAW,

htons(ETH_P_IP)))<0) {

perror("socket");

exit(1);

}

while (1) {

printf("----------n");

n = recvfrom(sock,buffer,2048,0,NULL,NULL);

printf("%d bytes readn",n);

/* Check to see if the packet contains at least

* complete Ethernet (14), IP (20) and TCP/UDP

* (8) headers.

*/

if (n<42) {

perror("recvfrom():");

printf("Incomplete packet (errno is %d)n",

errno);

close(sock);

exit(0);

}

ethhead = buffer;

printf("Source MAC address: "

"%02x:%02x:%02x:%02x:%02x:%02xn",

ethhead[0],ethhead[1],ethhead[2],

ethhead[3],ethhead[4],ethhead[5]);

printf("Destination MAC address: "

"%02x:%02x:%02x:%02x:%02x:%02xn",

ethhead[6],ethhead[7],ethhead[8],

ethhead[9],ethhead[10],ethhead[11]);

iphead = buffer+14; /* Skip Ethernet header */

if (*iphead==0x45) { /* Double check for IPv4

* and no options present */

printf("Source host %d.%d.%d.%dn",

iphead[12],iphead[13],

iphead[14],iphead[15]);

printf("Dest host %d.%d.%d.%dn",

iphead[16],iphead[17],

iphead[18],iphead[19]);

printf("Source,Dest ports %d,%dn",

(iphead[20]<<8)+iphead[21],

(iphead[22]<<8)+iphead[23]);

printf("Layer-4 protocol %dn",iphead[9]);

}

}

}

PF_PACKET協(xié)議簇可以讓一個應(yīng)用程序把數(shù)據(jù)包變成似乎從網(wǎng)絡(luò)層接收的樣子,但是沒有辦法抓到那些不是發(fā)向自己主機的包。正如我們前面看到的,網(wǎng)卡丟棄所有不含有主機MAC地址的數(shù)據(jù)包,這是因為網(wǎng)卡處于非混雜模式,即每個網(wǎng)卡只處理源地址是它自己的幀!

只有三個例外:如果一個幀的目的MAC地址是一個受限的廣播地址(255.255.255.255)那么它將被所有的網(wǎng)卡接收:如果一個幀的目的地址是組播地址,那么它將被那些打開組播接收功能的網(wǎng)卡所接收;網(wǎng)卡如被設(shè)置成混雜模式,那么它將接收所有流經(jīng)它的數(shù)據(jù)包最后一種情況當(dāng)然是我們最感興趣的了,把網(wǎng)卡設(shè)置成混雜模式,我們只需要發(fā)出一個特殊的ioctl()調(diào)用在那個網(wǎng)卡上打開一個socket,因為這是一個具有危險性的操作,所以這個調(diào)用只有具有root權(quán)限的用戶才可完成,假設(shè)那個“sock”包含一個已經(jīng)打開的socket。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
黄色成人小视频| av72成人在线| 欧美日韩一区二区免费视频| 久久综合影音| 久久国产精品久久久久久久久久 | 国产精品免费在线| 欧美性生交xxxxx久久久| 欧美人妖在线观看| 欧美日韩国产大片| 欧美日本亚洲| 欧美日韩一区二区三区在线| 欧美国产日韩一区二区| 欧美成人影音| 欧美精品久久久久久久久老牛影院| 久久久久久久精| 久久天天综合| 欧美成人一区二区在线| 欧美激情一区二区三区在线视频观看 | 亚洲欧美区自拍先锋| 亚洲一区二区在| 午夜精品久久久久久久久| 亚洲一区二区三区在线播放| 亚洲午夜性刺激影院| 亚洲欧美美女| 久久精品国产v日韩v亚洲| 久久久精品tv| 蜜臀av国产精品久久久久| 欧美成人午夜激情| 欧美日韩国产大片| 国产精品免费一区二区三区在线观看 | 在线视频亚洲欧美| 午夜精品视频网站| 欧美一区二区三区在线| 亚洲高清视频的网址| 亚洲精品一区二区三| 亚洲视频在线观看三级| 亚洲欧美激情一区| 久久裸体艺术| 欧美日韩成人免费| 国产欧美二区| 在线国产欧美| 一本大道久久a久久精二百| 亚洲在线观看| 亚洲国产日韩欧美综合久久| 日韩一级免费| 欧美中文在线观看国产| 嫩草成人www欧美| 欧美视频一区二区三区四区| 国产欧美一级| 亚洲国产裸拍裸体视频在线观看乱了中文 | 午夜国产精品影院在线观看| 久久精品视频导航| 日韩一级不卡| 香蕉久久久久久久av网站| 美女免费视频一区| 欧美视频在线观看一区| 国产一区二区三区最好精华液| 亚洲国产日韩在线一区模特| 在线中文字幕日韩| 亚洲国产成人精品久久| 亚洲午夜影视影院在线观看| 久久精品国产一区二区三区| 欧美激情一区二区三区| 国产精品视频一二三| 在线欧美电影| 亚洲综合色激情五月| 亚洲破处大片| 欧美综合国产| 欧美日韩国产成人| 黄色国产精品| 亚洲视频在线免费观看| 亚洲日本理论电影| 久久aⅴ国产欧美74aaa| 欧美日韩亚洲一区| 在线观看日韩av先锋影音电影院| 中文国产一区| 99re热这里只有精品视频| 久久精品一区二区三区中文字幕| 欧美日韩国产系列| 伊人夜夜躁av伊人久久| 亚洲综合不卡| 亚洲视频国产视频| 麻豆av一区二区三区| 国产麻豆日韩| 在线亚洲欧美视频| 日韩视频在线观看一区二区| 久久久精彩视频| 国产欧美一区二区三区在线老狼| 亚洲精品乱码| 亚洲国产一区二区三区青草影视| 亚洲欧美中文日韩v在线观看| 欧美激情视频免费观看| 黄色精品一区| 欧美一区激情| 欧美在线精品一区| 国产精品乱看| 一区二区三区国产在线观看| 亚洲精品男同| 美女脱光内衣内裤视频久久影院 | 久久久精品动漫| 国产精品尤物| 亚洲一区二区三区免费观看 | 黄网站免费久久| 亚洲免费网址| 亚洲影院色无极综合| 欧美激情在线观看| 揄拍成人国产精品视频| 久久爱www.| 久久久亚洲国产美女国产盗摄| 国产精品日韩在线观看| 在线视频亚洲一区| 亚洲一区在线免费| 国产精品v欧美精品v日韩| 日韩五码在线| 一区二区三区日韩欧美| 欧美日本中文字幕| 亚洲精品综合精品自拍| 日韩一级片网址| 欧美看片网站| 亚洲第一主播视频| 亚洲精品欧美精品| 欧美电影电视剧在线观看| 亚洲国产婷婷香蕉久久久久久99 | 久久婷婷蜜乳一本欲蜜臀| 国产婷婷色一区二区三区在线 | 亚洲欧美综合一区| 久久国产精品久久国产精品| 国产婷婷成人久久av免费高清| 性色av一区二区三区| 久久国产色av| 国内伊人久久久久久网站视频| 久久9热精品视频| 欧美在线观看视频在线 | 狠狠色狠狠色综合日日tαg| 欧美专区第一页| 老牛影视一区二区三区| 亚洲国产精品久久久久秋霞影院| 亚洲精品一区在线观看| 欧美日韩在线播放三区四区| 中日韩高清电影网| 欧美一区二区三区精品| 国产色产综合产在线视频| 欧美一区二区视频在线观看| 久久久伊人欧美| 亚洲国产美女久久久久| 一本色道久久综合一区| 欧美手机在线| 性亚洲最疯狂xxxx高清| 久久这里有精品15一区二区三区 | 亚洲成在线观看| 99热精品在线观看| 国产精品久久久久久久久果冻传媒 | 欧美黄色成人网| 一区二区三区四区精品| 欧美在线中文字幕| 亚洲国产精品女人久久久| 亚洲网友自拍| 国产手机视频一区二区| 亚洲欧洲午夜| 欧美性猛交一区二区三区精品| 亚洲欧美国产精品桃花| 免费不卡亚洲欧美| 99这里只有久久精品视频| 欧美一二三区精品| 亚洲第一精品夜夜躁人人爽| 一区二区三区国产在线| 国产精品丝袜白浆摸在线| 久久精品国产69国产精品亚洲 | 狠狠色狠色综合曰曰| 一本色道精品久久一区二区三区 | 久久精品久久99精品久久| 在线免费不卡视频| 亚洲欧美日韩一区二区| 伊人久久婷婷| 午夜在线电影亚洲一区| 亚洲电影在线看| 午夜亚洲精品| 亚洲精品美女久久久久| 欧美一区二区三区的| 亚洲欧洲日本一区二区三区| 午夜亚洲性色福利视频| 亚洲激情六月丁香| 久久国产精品99国产精| 日韩午夜在线观看视频| 久久亚洲国产精品日日av夜夜| 亚洲乱亚洲高清| 久久久噜噜噜久噜久久| 一区二区三区高清在线观看| 免费在线观看精品| 亚洲欧美日韩久久精品| 欧美日韩18| 久久精品视频一| 国产精品视频在线观看| av成人福利| 伊人婷婷欧美激情| 久久成人这里只有精品| 一区二区三区日韩精品视频| 欧美1区2区| 久久不射网站| 国产精品亚洲片夜色在线|