linux 高階網路程式設計高階之rawsocket

2021-07-24 08:44:01 字數 2862 閱讀 7113

在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...