1. 程式人生 > >linux 高階網路程式設計進階之rawsocket

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

在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 <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>

#define BUFFER_MAX 2048

int main(int argc, char **argv)
{
	int rawsock;
	char buffer[BUFFER_MAX];
	char * ethhead;
	char * iphead;
	char * phead;

	// create rawsocket
	if ((rawsock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0){
		perror("rawsock create error");
		exit(1);
	}

	long framecount = 0;
	while ( 1 ) {
		int readnum = recvfrom(rawsock, buffer, 2048, 0 , NULL, NULL);
		if (readnum < 42) {
			printf("error: head is incomplete! \n");
			exit(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("%d", phead[i]ðernetmask);
			if (i !=3) {
				printf(".");
			}
		}
		printf("---------->");
		for (i = 4; i <= 7; i++) {
			printf("%d", phead[i] & ethernetmask);
			if (i != 7) {
				printf(".");
			}
		}
		printf("\n");

		int prototype = (iphead + 9)[0];
		phead = iphead + 20;

		// print Protocal mesg 
		printf("Protocal:");

		switch(prototype) {
			case IPPROTO_ICMP:
				printf("ICMP\n");
				break;
			case IPPROTO_IGMP:
				printf("IGMP\n");
				break;
			case IPPROTO_TCP:
				printf("TCP | source port: %u |", (phead[0]<<8) & 0xFF00 | phead[1] & 0xFF);
				printf("destport: %u\n", (phead[2]<<8) & 0xFF00 | phead[3] & 0xFF);
				int i;
				for (i = 0; i < readnum -54; i++)
					putchar(phead[19 + i]);
				break;

			case IPPROTO_UDP:
				printf("UDP | source port: %u |", (phead[0]<<8) & 0xFF00 | phead[1]&0xFF);
				printf("destport: %u\n", (phead[2]<<8) & 0XFF00 | phead[3] & 0xFF);
				break;
			case IPPROTO_RAW:
				printf("RAW:\n");
				break;
			default:
				printf("Unknow\n");
			

		}
		printf("-------------------------------END-------------------------------\n");
		
		
	}
	return 0;
}


以上rawsocket 可以抓取通過網絡卡的所有資料包, 分析了收到的資料報型別, 並著重就 tcp 報文, 抓取了報文內容並打印出來。

總結與分析:

    使用欄位分析的程式設計方式,原理簡單, 只要對幀頭和ip頭的欄位熟悉, 可以用非常小的程式碼量就寫出抓包工具, 並且方便自定義修改; 

    以上是將擷取到的 資料報 分析出來, 下一次部落格內容將 自定義IP 包, 自己填充ip報文頭, 將資料包發出去,用這種方式可以偽造ip, 寫Dos 攻擊程式等。 

相關推薦

linux 高階網路程式設計rawsocket

在linux套接字程式設計中,常見的套接字型別有SOCK_STREAM, SOCK_DGRAM  .  int socket(int domain, int type, int protocal), 其中 type 欄位的 選項可以是:     SOCK_STREAM  

Socket網路程式設計與實戰資源分享

Socket網路程式設計進階與實戰資源分享 Socket網路程式設計進階與實戰資源分享 獲取資源新增qq+2100776785 獲取資源新增qq+2100776785 第1章 課程介紹 本章將從軟體測試的起源與發展、測試行業的現狀及職業生涯規劃等整體做介紹。 第2章 軟體測試工程師必

第四模組:網路程式設計&資料庫開發 口述

子程序死了之後 ,父程序關閉的時候要清理掉子程序的殭屍程序(收屍),孤兒程序是指父程序先死掉了的,交給init管理。 join() 等待子程序結束後才執行主程序下面的程式碼 即使可以利用的cpu只有一個(早期的計算機確實如此),也能保證支援(偽)併發的能力。將一個單獨的cpu變成多個虛擬的cpu(多道技術

第八章網路程式設計

####一、問答題1、簡述計算機作業系統中的“中斷”的作用? 中斷指當出現需要時,CPU暫時停止當前程式的執行轉而執行處理新情況的程式和執行過程 計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得cpu暫時中斷當前正在執行的程式而轉去執行相應的事件處理程式。 待處理完畢後又返回原來被中

Socket網路程式設計與實戰目前最新

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。...1-1 課前必讀(不

最新Socket網路程式設計與實戰

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。...1-1 課前必讀(不

(全網稀缺資源)Socket網路程式設計與實戰-2018年M課網

  課程介紹:        Socket對於每個工程師的重要性不言而喻。本課程將理論結合實踐,帶你從零開始,系統學習Socket程式設計技術,讓Socket的學習不再那麼零散與難以掌握,同時會提煉出Socket網路傳輸的核心思想與構

2018最新Socket網路程式設計與實戰(更新至第九章)

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。...1-1 課前必讀(不

Socket網路程式設計與實戰

第4章 Socket TCP快速入門 TCP可以說是Socket的最重要組成,同時也是網路傳輸的基礎;有了TCP基石才有如今穩定的網路傳輸。本章節讓大家明白TCP的重要性,同時學會利用TCP進行簡單的資料傳輸。本章節主要收穫:1. 明白TCP是什麼,理解TCP的重要性,2. 學會TCP的精髓以及API

一個java高階工程師的路【轉】

巨集觀方面 一、 JAVA。要想成為JAVA(高階)工程師肯定要學習JAVA。一般的程式設計師或許只需知道一些JAVA的語法結構就可以應付了。但要成為JAVA(高階) 工程師,您要對JAVA做比較深入的研究。您應該多研究一下JDBC、IO包、Util包、Text包、JMS、EJB、RMI

Socket網路程式設計與實戰(目前最新)

. 第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。.

Socket網路程式設計與實戰分享

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。

某網最新《Socket網路程式設計與實戰》

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。..

某課最新《Socket網路程式設計與實戰》

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。..

某課《Socket網路程式設計與實戰》分享

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。..

Socket網路程式設計與實戰目前最全

第1章 課程導學(Java語言教學)【說明:課程案例部分以Java語言實現】本章節首先會對課程進行導學講解,包括為什麼應該學習本課程,課程目標與收穫,課程內容安排,適合人群和學習建議等,接著會講解程式碼規範與開發注意事項,目的全在於希望極大的方便同學進行本課程的學習。...1-1 課前必讀(不

Socket網路程式設計與實戰(更新至第九章)2018(最全)

1、 構造方法沒有返回型別,類方法有。 2、 類方法 static 所有物件 3、 繼承:extends 引用 /*  *如程式碼,問題: h4所指向的物件和h2所指向的物件,是否是同一個物件?  */ package basis; public class Hero&n

ASP.NET 高階程式設計師路——快捷鍵篇

引言:我們都知道快捷鍵使用得熟,將極大的提高我們的開發效率。可是我發現許多開發人員老喜歡用滑鼠去點,不擅長使用快捷鍵。 1、VS常用快捷鍵 這個我們記住開發中常用的就可以了。 F4:開啟屬性面板。

一個Java高階工程師的

尚學堂AD 想必Java新手們都想知道如何成為一個Java高階工程師,小編整理了一下Java高階工程師必須具備的一些專業技能供大家參考,希望可以幫到大家! 巨集觀方面 JAVA 要想成為JAVA(高階)工程師肯定要學習JAVA。一般的程式設計師或許只需知道

Python網路程式設計

網路通訊 使用網路的目的 把多方連結在一起,進行資料傳遞; 網路程式設計就是,讓不同電腦上的軟體進行資料傳遞,即程序間通訊; ip地址 ip地址概念和作用 IP地址是什麼:比如192.168.1.1 這樣的一些數字; ip地址的作用:用來在電腦中 標識唯一一臺電腦,比如192.168.1.1;在本地區域網是唯