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;在本地區域網是唯