在linux套接字程式設計中,常見的套接字型別有sock_stream, sock_dgram .
int socket(int domain, int type, int protocal), 其中 type 欄位的 選項可以是:
sock_stream
sock_dgram
sock_seqpacket
sock_raw
provides raw network protocal access.
sock_rdm
sock_packet
原始套接字rawsocket 因其能獲得最底層的ip包,因而有其特殊的作用。其用處,例如:
1. 怎樣傳送乙個自定義的ip包 ?
2. 怎樣傳送乙個icmp協議包 ?
3. 怎樣分析所有經過網路的包 ,而不管這包是否是發給自己的?
4. 怎樣偽裝本地ip位址 ?
以上所有這些,原始套接字(sock_raw), 都可以幫你實現! !
(tips: 原始套接字廣泛應用於高階網路程式設計,也是一種廣泛的黑客手段,著名的網路sniffer, 拒絕服務攻擊dos,ip欺騙 等都可以通過原始套接字實現)
原始套接字的使用,有一點需要注意:只有管理員許可權 (root) 才可使用
在建立套接字時的第三個選項 protocal , 可以指定獲取某一型別的 rawsocket
socket(pf_packet, sock_raw, int protocal )
protocal 選項:
- 不能為0
- 傳引數時需要使用 htons() 轉換
eth_p_ip : ipv4 資料報
eth_p_arp : arp 資料報
eth_p_all : 任何協議的資料報
下面將介紹一種,最簡單最有效的 rawsocket 應用:抓取ip包
在此之前,有兩點需要了解:一是 乙太網幀結構,二是ip 包報文頭結構
frame 乙太網幀結構
從幀首界定符sfd之後, 從 da 開始 就是 幀結構的幀頭了,這裡介紹一下前導碼
前導碼:
10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011
前導碼的作用是通知接收節點做好接收準備, 接收節點收到 10101011 後就知道幀 開始了
ip報文頭
了解以上兩個頭部之後,就可以使用rawsocket了, 這裡給出乙個頭部分析的例子
analysis_rawsocket.c
#include #include #include #include #include #include #include #define buffer_max 2048
int main(int argc, char **argv)
long framecount = 0;
while ( 1 )
ethhead = (char *)buffer;
phead = ethhead;
int ethernetmask = 0xff;
framecount++;
printf("--------------analysis packet[%d]-------------\n", framecount);
// printf src mac and dst mac
fprintf(stderr, "mac:");
int i = 6;
for (; i <= 11; i++)
fprintf(stderr, "%.2x:", phead[i]ðernetmask);
fprintf(stderr, "--------->");
for (i = 0; i <= 5; i++)
fprintf(stderr, "%.2x", phead[i]ðernetmask);
printf("\n");
iphead = ethhead + 14;
phead = iphead + 12;
// print ip address
printf("ip:");
for (i = 0; i<= 3; i++)
} printf("---------->");
for (i = 4; i <= 7; i++)
} printf("\n");
int prototype = (iphead + 9)[0];
phead = iphead + 20;
// print protocal mesg
printf("protocal:");
switch(prototype)
printf("-------------------------------end-------------------------------\n");
} return 0;
}
以上rawsocket 可以抓取通過網絡卡的所有資料報, 分析了收到的資料報型別, 並著重就 tcp 報文, 抓取了報文內容並列印出來。
總結與分析:
使用字段分析的程式設計方式,原理簡單, 只要對幀頭和ip頭的字段熟悉, 可以用非常小的**量就寫出抓包工具, 並且方便自定義修改;
以上是將擷取到的 資料報 分析出來, 下一次部落格內容將 自定義ip 包, 自己填充ip報文頭, 將資料報發出去,用這種方式可以偽造ip, 寫dos 攻擊程式等。
Linux高階之Shell程式設計
shell是乙個命名行直譯器,它為使用者提供乙個向linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用shell來啟動 掛起 停止甚至是編寫一些程式。1 指令碼以 bin bash 開頭 2 指令碼需要有可執行許可權 3 hello,word bin bash echo hello,wo...
Linux 網路程式設計 高階套接字
一 套接字選項 有以下3中方式可以對套接字選項進行設定 getsockopt和setsockopt函式用於獲得和設定套接字的選項值,fcntl用來操作檔案描述符的有關屬性,比如設定套接字檔案描述符工作於非阻塞模式等,而ioctl用於控制i o裝置。套接字選項和協議層 協議層 level 選項 opt...
網路程式設計雜項高階
tcp聊天,server端實現 import socket sk socket.socket 例項化socket物件 address 0.0.0.0 8000 設定埠 sk.bind address 繫結ip位址和埠 sk.listen 5 監聽 while true conn,addr sk.ac...