urp源碼
1. 怎樣用c語言實現網路抓包
第一法則:站在巨人肩膀上 && 不要重復造輪子。
對於這種復雜的過程,第一選擇是使用現成的,節約時間,提升效率。
Wireshark(前稱Ethereal)是一個網路封包分析軟體。網路封包分析軟體的功能是擷取網路封包,並盡可能顯示出最為詳細的網路封包資料。Wireshark使用WinPCAP作為介面,直接與網卡進行數據報文交換。
網路封包分析軟體的功能可想像成 "電工技師使用電表來量測電流、電壓、電阻" 的工作 - 只是將場景移植到網路上,並將電線替換成網路線。在過去,網路封包分析軟體是非常昂貴,或是專門屬於營利用的軟體。Ethereal的出現改變了這一切。在GNUGPL通用許可證的保障范圍底下,使用者可以以免費的代價取得軟體與其源代碼,並擁有針對其源代碼修改及客制化的權利。Ethereal是目前全世界最廣泛的網路封包分析軟體之一。第二法則:學習 && 提升。
如果是單純的學習知識,可以直接嘗試寫一些具有部分功能的程序,過程會有點艱難,但非常有意義。學習網路編程,需要了解 開放系統互連參考模型的的七層每一層的意義以及現實當中實現的四層的網路協議。然後就可以知道抓包的包位於模型當中的傳輸層協議,包括UDP和TCP的協議。進一步要學習每種協議的格式,表頭,數據包等等。一句話,冰凍三尺非一日之寒。
Windows下的抓包及簡單的編程。
Windows2000在TCP/IP協議組件上做了很多改進,功能也有增強。比如在協議棧上的調整,增大了默認窗口大小,以及高延遲鏈接新演算法。同時在安全性上,可應用IPSec加強安全性,比NT下有不少的改進。
Microsoft TCP/IP 組件包含「核心協議」、「服務」及兩者之間的「介面」。傳輸驅動程序介面 (TDI) 與網路設備介面規范 (NDIS) 是公用的。 此外,還有許多用戶模型應用程序的更高級介面。最常用的介面是 Windows Sockets、遠程過程調用 (RPC) 和 NetBIOS。
Windows Sockets 是一個編程介面,它是在加州大學伯克利分校開發的套接字介面的基礎上定義的。它包括了一組擴展件,以充分利用 Microsoft Windows 消息驅動的特點。規范的 1.1 版是在 1993 年 1 月發行的,2.2.0 版在 1996 年 5 月發行。Windows 2000 支持 Winsock 2.2 版。在Winsock2中,支持多個傳輸協議的原始套接字,重疊I/O模型、服務質量控制等。
這里介紹Windows Sockets的一些關於原始套接字(Raw Socket)的編程。同Winsock1相比,最明顯的就是支持了Raw Socket套接字類型,通過原始套接字,我們可以更加自如地控制Windows下的多種協議,而且能夠對網路底層的傳輸機制進行控制。
1、創建一個原始套接字,並設置IP頭選項。
SOCKET sock;
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
或者:
s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
這里,我們設置了SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。創建原始套接字後,IP頭就會包含在接收的數據中,如果我們設定 IP_HDRINCL 選項,那麼,就需要自己來構造IP頭。注意,如果設置IP_HDRINCL 選項,那麼必須具有 administrator許可權,要不就必須修改注冊表:
HKEY_LOCAL_
修改鍵:DisableRawSecurity(類型為DWORD),把值修改為 1。如果沒有,就添加。
BOOL blnFlag=TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
對於原始套接字在接收數據報的時候,要注意這么幾點:
a、如果接收的數據報中協議類型和定義的原始套接字匹配,那麼,接收的所有數據就拷貝到套接字中。
b、如果綁定了本地地址,那麼只有接收數據IP頭中對應的遠端地址匹配,接收的數據就拷貝到套接字中。
c、如果定義的是外部地址,比如使用connect(),那麼,只有接收數據IP頭中對應的源地址匹配,接收的數據就拷貝到套接字中。2、構造IP頭和TCP頭
這里,提供IP頭和TCP頭的結構:
// Standard TCP flags
#define URG 0x20
#define ACK 0x10
#define PSH 0x08
#define RST 0x04
#define SYN 0x02
#define FIN 0x01
typedef struct _iphdr //定義IP首部
{
unsigned char h_lenver; //4位首部長度+4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct psd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSD_HEADER;
typedef struct _tcphdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCP_HEADER;
TCP偽首部並不是真正存在的,只是用於計算檢驗和。校驗和函數:
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
當需要自己填充IP頭部和TCP頭部的時候,就同時需要自己計算他們的檢驗和。
3、發送原始套接字數據報
填充這些頭部稍微麻煩點,發送就相對簡單多了。只需要使用sendto()就OK。
sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in));
下面是一個示常式序,可以作為SYN掃描的一部分。
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255
typedef struct ip_hdr //定義IP首部
{
unsigned char h_verlen; //4位首部長度,4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHEADER;
typedef struct tsd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSDHEADER;
typedef struct tcp_hdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCPHEADER;
//CheckSum:計算校驗和的子函數
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
void useage()
{
printf("****************************************** ");
printf("TCPPing ");
printf(" Written by Refdom ");
printf(" Email: [email protected] ");
printf("Useage: TCPPing.exe Target_ip Target_port ");
printf("******************************************* ");
}
int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;
useage();
if (argc!= 3)
{ return false; }
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error! ");
return false;
}
if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf("Socket Setup Error! ");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error! ");
return false;
}
nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error! ");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
//
//
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("本地地址");
ipHeader.destIP=inet_addr(argv[1]);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源埠號
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改這里來實現不同的標志位探測,2是SYN,1是FIN,16是ACK探測 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
//計算校驗和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d ",WSAGetLastError());
return false;
}
else
printf("send ok! ");
closesocket(sock);
WSACleanup();
return 0;
}
4、接收數據
和發送原始套接字數據相比,接收就比較麻煩了。因為在WIN我們不能用recv()來接收raw socket上的數據,這是因為,所有的IP包都是先遞交給系統核心,然後再傳輸到用戶程序,當發送一個raws socket包的時候(比如syn),核心並不知道,也沒有這個數據被發送或者連接建立的記錄,因此,當遠端主機回應的時候,系統核心就把這些包都全部丟掉,從而到不了應用程序上。所以,就不能簡單地使用接收函數來接收這些數據報。
要達到接收數據的目的,就必須採用嗅探,接收所有通過的數據包,然後進行篩選,留下符合我們需要的。可以再定義一個原始套接字,用來完成接收數據的任務,需要設置SIO_RCVALL,表示接收所有的數據。
SOCKET sniffersock;
sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(sniffersock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, & lpcbBytesReturned, NULL, NULL);
創建一個用於接收數據的原始套接字,我們可以用接收函數來接收數據包了。然後在使用一個過濾函數達到篩選的目的,接收我們需要的數據包。
如果在XP以上的操作系統,微軟封殺了Raw Soccket,只能用wincpap之類的開發包了。
加密方法太多了,你首先要搞清楚是用什麼加密的,base64還是什麼,要是md5的根本沒法解密
3. 發包長度大於1518的發包工具
三款常用IP發包工具介紹
SENDIP 可在各種UNIX 或linux 版本中運行,本人使用的是SLACKWARE 8.0 和
REDHAT 9.0 兩個版本。
可在網站http://www.earth.li/projectpurple/progs/sendip.html 中下載最新的源代碼或RPM
包,目前版本為2.5,源碼包大小隻有54K。
2.1.1. 安裝過程
SENDIP 的安裝過程非常簡單,首先從前面介紹的網站中下載最新的源代碼包,目前為
sendip-2.5.tar.gz。
在LINUX 系統中執行:
#tar –xzvf sendip-2.5.tar.gz
#cd sendip-2.5
#make
#make install
在系統的/usr/local/bin 目錄下會產生一個SENDIP 命令文件,同時,在/usr/local/lib 目錄
下建立一個sendip 目錄,並在其下放置ipv4.so、ipv6.so、tcp.so 等與協議相關的模塊文件。
通過在命令行下運行這個文件,我們可以產生各種各樣我們需要的IP 包,還可以通過運行
腳本自動發送大量的IP 包。
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第3 頁共14 頁
2.1.2. 發包方法
SENDIP 可以發送NTP, BGP, RIP, RIPng, TCP, UDP, ICMP、IPv4 和IPv6 等各種格式的
數據包,SENDIP 本身是以模塊的方式發送各種協議的數據包,用-p 參數指定協議類型,要
發送每種協議的數據包, 必須對該協議的數據包格式有一定的了解。通常發送
TCP/UDP/ICMP 數據包時,都必須以IP 包進行封裝,然後才可以發出去。本節我們將以TCP
數據包為例進行講述。
下面介紹一下SENDIP 的命令行格式,以下為直接執行SENDIP 時的輸出:
Usage: sendip [-v] [-d data] [-h] [-f datafile] [-p mole] [mole options] hostname
-d data add this data as a string to the end of the packet
Data can be:
rN to generate N random(ish) data bytes;
0x or 0X followed by hex digits;
0 followed by octal digits;
any other stream of bytes(以指定位元組的隨機數據填充包中的數據段)
-f datafile read packet data from file(以指定數據文件中的內容填充包中的數據段)
-h print this message(輸出幫助信息)
-p mole load the specified mole (see below)(指定協議類型)
-v be verbose(運行時輸出詳細運行信息,如不指定,運行時不輸出信息)
(協議類型是以模塊的方式指定的,用-p 參數指定)
Moles are loaded in the order the -p option appears. The headers from
each mole are put immediately inside the headers from the previos model in
the final packet. For example, to embed bgp inside tcp inside ipv4, do
sendip -p ipv4 -p tcp -p bgp ....
Moles available at compile time:
ipv4 ipv6 icmp tcp udp bgp rip ntp(支持的協議類型)
通常執行格式如下:
#sendip –v –d r64 –p ipv4 –iv 4 –ih 5 –il 128 –is 10.0.0.1 –id 30.0.0.1 –p tcp –ts 1379 –td 23 –tt 8 30.0.0.1
-v:運行時輸出詳細運行信息,如不指定,運行時不輸出信息
–d r64:用64 位元組的隨機數值填充IP 包中的數據段
–p ipv4:指定協議類型為IP 協議(IP 協議有自己的相應參數,以i 開頭)
–iv 4:協議版本為4,即IPV4
–ih 5:指定IP 頭的長度為5×4=20 位元組
–il 128:指定IP 包的總長度為128 位元組
–is 10.0.0.1:指定IP 包的源地址
–id 30.0.0.1:指定IP 包的目的地址
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第4 頁共14 頁
–p tcp:指定IP 包中封裝的包的協議類型(TCP 協議有自己的相應參數,以t 開頭)
–ts 1379:指定TCP 包的源埠1379
–td 23:指定TCP 包的目的埠為23
-tt 8:指定TCP 包的偏移量即TCP 頭的長度,沒有TCP 選項時為5,即20 字
節,有TCP 選項時需要增加。
30.0.0.1:指定發包的目的主機
以上部分為利用SENDIP 發送一個簡單的TCP 數據包的方法,下面結合IP 和TCP 數據
包的格式詳細介紹IP 和TCP 協議的各種參數。
具體各種協議的數據包格式可參考TCP/IP 協議中對各種協議數據包格式的介紹,下面
我們只介紹IP 數據包的格式和TCP 數據包的格式:
IP 數據包的格式:
根據IP 數據包的格式,SENDIP 有如下命令行參數可以指定對應的IP 數據包中參數的
值。
Field name
Size
(bits)
SendIP
option
Description
Version 4 -iv Always 4(對應「4 位版本」,通常值為4,表示IPV4)
Header length 4 -ih
IP header length, measured in 32bit words, 5 if there are
no options(對應「4 位首部長度」,表示以32 位即4
位元組為單位的IP 首部長度,如果沒有IP 參數的話,
通常為5,表示首部長度為20 位元組,如有IP 參數的
話,需要調整該值)
Type of
Service/Differentiated
Services
8 -iy
服務類型(TOS)欄位由8 位組成,其中包括3 位的
優先權欄位(現已被忽略)、4 位的TOS 子欄位和1
位未用位但必須置0,4 位TOS 子欄位分別代表最小
時延、最大吞吐量、最高可靠性和最小費用。4 位只
能置其中1 位,使用時只要將設置相應位後運算出十
進制值即可。如要設置最大吞吐量位(00001000),只
需添加參數iy 8 即可。
Total Length 16 -il Total length of IP packet including header and data,
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第5 頁共14 頁
measured in octets(指定IP 包的總長度,包括IP 頭部
分和數據部分,以8 位位元組為單位,最長為65535)
Identification 16 -ii
Used to help reassembled fragmented packets(指定IP
包的標識號,用來幫助重新組裝分段的IP 包)
-ifr 1 bit: reserved, should be 0
-ifd 1 bit: don't fragment(可指定-ifd x,下可為0、1 或r) Flags 3
-ifm 1 bit: more fragmets(可指定-ifm x,下可為0、1 或r)
Fragment offset 13 -if
Where in the reconstructed datagram this fragment
belongs, measured in 64bit words starting from 0(以8
位元組長度為單位,指定段偏移量)
Time to Live 8 -it
Number of routers the packet can pass through before
being discarded(值的范圍從0 到255,指定TTL,表
示該包可通過的路由器的數目,用於防止包在循環路
徑上無休止地傳遞)
Protocol 8 -ip
Protocol associated with the data. See iana for an
uptodate list of assigned numbers(用於定義IP 包內部
封裝的上層協議的協議號,如TCP 為6,可在IANA
的網站上
http://www.iana.org/assignments/protocol-numbers
獲得最新的協議號表)
Header checksum 16 -ic
Checksum of the IP header data (with checksum set to
zero)(可指定IP 首部校驗和的值,通常由SENDIP 自
動生成,不指定該參數,除非要發出帶有錯誤校驗和
的包)
Source Address 32 -is Duhh...(源地址,以點分十進制方式表示)
Destination Address 32 -id Cabbage(目的地址,以點分十進制方式表示)
Options Variable -io...
No options are required. Any number can be added. See
below for details(定義各種IP 選項,如果定義了IP
選項,則前面的IP 頭的長度值要包括IP 選項的長度,
不帶IP 選項時,該值為20,帶IP 選項時,可設定該
值,如果要故意製造不匹配的包,可不符合規范。)
如果有IP 選項,還可指定IP 選項的值,SENDIP 支持的IP 選項如下表所示。
Name
SendIP
option
RFC Copy Class Number
Type
(see
above)
Length
(0 not
present)
Description
EOL -ioeol 791 0 0 0 0 0
Used as padding if needed
(使用該選項後,會自動在IP 頭
中未用到的位補0)
NOP -ionop 791 0 0 1 1 0
Do nothing. Often used as padding
so the next option starts on a 32 bit
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第6 頁共14 頁
boundary
RR -iorr 791 0 0 7 7 variable
Used to record the route of a
packet.(記錄包走過的每個路由
器, 通常用法是: -iorr
0f:ff.ff.ff.ff:10.0.0.234 –ioeol,其中
iorr 表示記錄路由,此時系統會自
動將IP 選項號置為07,0f 表示指
針,即記錄的最後一個IP 地址的
指針,系統會自動運算該IP 選項
的長度)
TS -iots 791 0 2 4 68 variable
Used to record the time at which a
packet was processed by an
intermediate system
LSR -iolsr 791 1 0 3 131 vairable
Loose Source Route - let the
source specify the route for a
packet.
SID -iosid 791 1 0 8 136 4
Rarely used, carries the SATNET
stream identifier.
SSR -iossr 791 1 0 9 137 variable
Strict Source Route - same as LSR,
but extra hops are not allowed.
SEC
791,
1108
1 0 2 130 variable Security, rarely used
E-SEC 1108 1 0 5 133 variable Extended Security, rarely used
通常在SENDIP 中指定IP 選項時,格式比較特別,下面我們以RR 記錄路由選項為例
介紹一下,如果要發送一個記錄三個IP 的數據包,需要考慮如下,一是指定IP 頭的長度要
包括IP 選項的長度,而是要指定RR 記錄路由選項的指針位置和IP 地址(本來是由系統自
動記錄IP 和更新指針位置,但現在必須手工指定),那麼記錄三個IP 包後,指針的位置應
是3+4×3+1=16,造好後,數據包的格式應該如下:
IP 頭07 15 16 10.0.0.234(IP1) 20.0.0.234(IP2) 30.0.0.234(IP3) 00(ioeol) tcp
20B RR len ptr 4bytes 4bytes 4bytes Ptr
具體命令行如下:
#sendip –d r64 –p ipv4 –iv 4 –ih 10 –il 128 –is 10.0.0.1 –id 30.0.0.1 –iorr 10:10.0.0.234:20.0.0.234:30.0.0.234
–ioeol –p tcp –ts 1379 –td 23 –tt 8 30.0.0.1
-ih 10 表示IP 頭的長度為10×4 為40 個位元組,去除標準的20 個位元組長度,為IP
選項預留為20 個位元組
-iorr 10:10.0.0.234:20.0.0.234:30.0.0.234 中第一個10 表示用16 進製表示的指針的
位置,後面為用冒號分隔的三個用點分十進製表示的IP 地址
-ioeol 表示用00 結束IP 選項,並用隨機數填充後面未用的IP 頭位置
以上部分只是以RR 記錄路由IP 選項為例,介紹了sendip 中指定IP 選項的方法,當然
也可以根據自己的要求發送IP 選項不符合常規的數據包。其他的IP 選項與此雷同,但發送
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第7 頁共14 頁
前需要詳細了解IP 選項的格式,才可正確發送。
TCP 數據包的格式:
根據TCP 數據包的格式,SENDIP 有如下命令行參數可以指定對應的TCP 數據包中參
數的值。
Field name
Size
(bits)
SendIP
option
Description
Source port 16 -ts
Source port number for the connection
(以十進制的方式指定TCP 原埠)
Destination port 16 -td
Destination port number
(以十進制的方式指定TCP 目的埠)
Sequence number 32 -tn
Number of the first data octet in this packet. If SYN bit is
set, this is the number of the first data octet of the stream
too.(指定TCP 序列號,如果不指定則隨機產生)
Acknowledgment
number
32 -ta
If ACK bit is set, the next sequence number the sender is
expecting to receive.
Data offset 4 -tt
Length of TCP header in 32 bit words(指定TCP 頭的長
度,單位是以32bits 也就是4 位元組為單位)
Reserved 4 -tr
Should be 0. Note, rfc793 defines this as a 6 bit field, but
the last 2 are used by rfc2481 for ECN as below.
Flags: ECN 1 -tfe
Flags: CWR 1 -tfc
ECN extension flags, see rfc2481. (指定TCP 標志位,
如果要打開哪一位,就在命令行參數中指定相應位的
值,如要設置SYN 狀態,只需在命令行加入-tfs 1 即可
)
Flags: URG 1 -tfu Urgent pointer is significant(同上)
Flags: ACK 1 -tfa Acknowledgment field is significant(同上)
Flags: PSH 1 -tfp Push function(同上)
Flags: RST 1 -tfr Reset the connection(同上)
Flags: SYN 1 -tfs Synchronize sequence numbers(同上)
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第8 頁共14 頁
Flags: FIN 1 -tff No more data from sender(同上)
Window 16 -tw
Number of octet starting from the one in the
Acknowledgement field that the sender is willing to
accept
Checksum 16 -tc
Checksum of the TCP header (with checksum set to 0),
data, and a psuedo-header including the source and
destination IP addresses, IP protocol field and a 16 bit
length of the TCP header and data.
Urgent pointer 16 -tu
If URG bit is set, tHe offset of the last octet of urgent data
in this packet.
Options Variable -to...
No options are required. Any number can be added. See
below for details.
如果有TCP 選項,還可指定TCP 選項的值,SENDIP 支持的TCP 選項如下表所示。
Name
SendIP
option
RFC Type
Length (0
not
present)
Description
EOL -toeol 793 0 0
Used as padding if needed(用00 填充,表示TCP
選項結束,把TCP 頭後面的位置用隨機數填充)
NOP -tonop 793 1 0
Do nothing. Often used as padding so the next
option starts on a 32 bit boundary
MSS -tomss 793 2 4
Specify the maximum recieve segment size of the
sender as a 16 bit number. Only valid when SYN is
also set
WSOPT -towscale 1323 3 3
The window size should be leftshifted by the value
of the option (an 8 bit number). Only valid when
SYN is also set.
SACKOK -tosackok 2018 4 2
Selective Acknowledgement is permitted on this
connection
SACK -tosack 2018 5 variable
Selective Acknowledgement of non-contiguous
blocks of data. The data in the option is a series of
(left edge)-(right edge) pairs giving, respectively,
the first sequence number the has been recieved and
the first that hasn't.
TSOPT -tots 1323 8 10
Timestamp. The first 4 bytes (TSval) are the time
that the packet was sent, the remaining 4 (TSecr)
echo the TSval of a packet that was recieved. TSecr
is only valid when the ACK bit is set.
從上表所示,可以看出,TCP 選項可能只有一個單位元組參數,如-toeol 和-tonop,也可
能由一個Type 號和一個length 長度以及該length 長度指定的位元組數的數據組成的參數,使
用時sendip 會自動運算length 的長度,所以,不能隨意設定TCP 選項的長度,但需要設定
TCP 選項的值。
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第9 頁共14 頁
在設定TCP 選項時,同樣要考慮到TCP 頭的長度要包括TCP 選項的長度。
TCP 選項數據包的格式大致如下:
Kind=3 Len=3 數據:移位數
TCP 選項號TCP 選項長度TCP 選項數據佔一個位元組,總長度為三個位元組
具體命令行格式可參照如下格式:
#sendip –d r64 –p ipv4 –iv 4 –ih 10 –il 128 –is 10.0.0.1 –id 30.0.0.1 –iorr 10:10.0.0.234:20.0.0.234:30.0.0.234
–ioeol –p tcp –ts 1379 –td 23 –tt 8 –tfa 0 –tfs 1 –towscale 0 –toeol 30.0.0.1
-towscale 0 :指設置TCP 選項3,長度為自動3,TCP 選項的值即移位數為0
-toeol :表示TCP 選項結束,後面用隨機數填滿TCP 頭
因為用SENDIP 設定TCP 選項時,不能設定長度,所以,如果要設定長度不正確的包,
還要藉助其他工具,如SNIFFER,用SNIFFER 抓到SENDIP 發送的包後,再將對應的TCP
選項的長度改為不規則的值即可。
根據前面介紹的內容,我們已經基本可以掌握用SENDIP 發送各種協議數據包的方法,
當然我們還可以利用他發送各種不符合標準的數據包,如校驗和錯誤、長度不正確、狀態位
不正確等各種我們需要的數據包,在使用時,建議與SNIFFER 搭配使用,以驗證SENDIP
發出的包是否正確,進行有針對性的測試。
2.2. NESSUS 工具
NESSUS 是一個非常龐大的工具,它可以提供功能完善的安全掃描服務,還可以提供全
面的發包功能,用以構造各種格式的網路通信包。本篇只關注NESSUS 的發包功能。
NESSUS 由兩個部分組成,一部分是伺服器,通常運行在POSIX 系統如LINUX/UNIX
系統中,負責掃描和攻擊,並收集數據,另一部分是客戶端,可以運行在LINUX/UNIX 系
統或WINDOWS 系統中,負責接收和顯示數據。
如果只是用來發包,則只需要服務端即可。
NESSUS 有專門的維護網站,可以隨時到http://www.nessus.org 網站下載最新的源代碼,
並獲得全面的幫助。目前,NESSUS 最新的版本為2.0.8a。
2.2.1. NESSUS 安裝方法
安裝NESSUS 前要知道NESSUS 可能需要的支撐軟體包,一個是GTK,通常POSIX
系統下的NESSUS 客戶端需要GTK,如果你的系統安裝了GTK,則必須確保安裝了
gtk-config 程序,可到ftp://ftp.gimp.org/pub/gtk/v1.2 網站下載最新的GTK 程序,如果只在
LINUX/UNIX 系統下安裝服務端,則可以不需要GTK 包;另一個是OPENSSL 包,如果希
望客戶端和服務端的通信採用SSL 方式,則需要OPENSSL 包,可到http://www.openssl.org/
下載最新的OPENSSL 包,OPENSSL 包是可選的。
NESSUS 有三種安裝方法:第一種是利用LINUX 下的LYNX 工具直接從網上安裝,這
種方法很容易,但安全性低,在此不予詳細介紹,可到NESSUS 網站上獲取相關信息。第
二種方法是使用NESSUS 提供的nessus-installer.sh 工具,直接安裝,這種方法簡單且安全性
比較高。第三種方法是獲取源碼包,然後分別編譯再進行安裝。下面分別介紹第二種和第三
種方法。
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第10 頁共14 頁
2.2.1.1. 採用nessus-installer.sh 方式安裝
從NESSUS 網站下載最新的nessus-installer.sh 文件到本地LINUX 目錄,然後執行
#sh nessus-installer.sh
系統會自動安裝NESSUS 到你的系統中,中間會需要你提供相關的提示信息,一直按
回車即可。
2.2.1.2. 採用源碼包方式安裝
如果採用源碼包方式進行安裝,需要下載四個軟體包,並按順序進行安裝。四個軟體包
分別如下:
nessus-libraries
libnasl
nessus-core
nessus-plugins
安裝時必須按順序安裝這四個軟體包。
安裝前,我們必須獲得上面所說的四個軟體包,目前版本為2.0.8a:
nessus-libraries-x.x.tar.gz
libnasl-x.x.tar.gz
nessus-core.x.x.tar.gz
nessus-plugins.x.x.tar.gz
然後開始進行安裝。
1. 安裝nessus-libraries
#tar –xzvf nessus-libraries-x.x.tar.gz
#cd nessus-libraries-x.x
#./configure
#make
#make install
2. 安裝libnasl-x.x.tar.gz (執行與上面相同的操作)
3. 安裝nessus-core.x.x.tar.gz(執行與上面相同的操作)
4. 安裝nessus-plugins.x.x.tar.gz (執行與上面相同的操作)
5. 如果使用的是LINUX 系統,必須確保/usr/local/lib 路徑在/etc/ld.so.conf 文件中,如
果是SOLARIS 系統, 必須執行export LD_LIBRARY_PATH=
$LD_LIBRARY_PATH :/usr/local/lib 命令。
6. 執行ldconfig 命令
7. 如果不想或不能使用GTK 的客戶端,可強制使用命令行方式,這時,在執行第三
步編譯nessus-core 時,可以使用如下命令:
#tar –xzvf nessus-libraries-x.x.tar.gz
#cd nessus-libraries-x.x
#./configure --disable-gtk
#make
#make install
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第11 頁共14 頁
執行以上命令後,NESSUS 就已經安裝在您的系統中了。
2.2.2. NESSUS 的發包方法
NESSUS 通常採用腳本方式控制發出的包,下面我們以發送聖誕老人攻擊包為例,來介
紹如何利用NESSUS 發送數據包。
聖誕老人包是通過發送TCP Flag 中同時有SYN 和FIN 標志的數據包,穿透防火牆,
來達到攻擊的目的。
為使用NESSUS 發送攻擊包,首先要定義一個腳本,在LINUX 下,執行vi sendp 命令,
輸入如下內容:
srcaddr=this_host(); 註:自動獲取當前主機的IP 地址
ip = forge_ip_packet( ip_v : 4, 註:IP 協議版本為IPV4
ip_hl : 5, 註:IP 頭的長度為5×4=20 位元組
ip_tos : 0,
ip_len : 40, 註:在這里輸入實際的長度40,因為IP 頭和TCP 頭都為20
ip_id : 0xABA,
ip_p : IPPROTO_TCP, 註:內部數據包協議為TCP
ip_ttl : 255,
ip_off : 0,
ip_src : srcaddr); 註:可在此直接輸入IP
port = get_host_open_port(); 註:自動獲取當前主機上的可用埠
if(!port)port = 139; 註:如果沒有可用埠,就自動使用139 埠
tcpip = forge_tcp_packet( ip : ip, 註:表示IP 層協議採用前面定義的IP 協議包
th_sport : port, 註:可在這里直接輸入埠
th_dport : port, 註:可在這里直接輸入埠
th_flags : TH_SYN|TH_FIN, 註:設置TCP 狀態的SYN 和FIN 標志位
th_seq : 0xF1C,
th_ack : 0,
th_x2 : 0,
th_off : 5, 註:TCP 頭的長度位5×4=20 位元組
th_win : 512,
th_urp : 0);
result = send_packet(tcpip,pcap_active:FALSE);
編輯完上面的腳本後,保存退出,運行如下命令:
#nasl –t 目的IP 地址測試腳本
如:
#nasl –t 10.0.0.227 sendp
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第12 頁共14 頁
通過Sniffer 抓包,就會發現有相應的聖誕老人包。
在我的使用過程中,發現NESSUS 好像不支持發送帶有IP 或TCP 選項的包。
具體發包的參數可參考http://www.nessus.org/doc/nasl.html
2.3. SNIFFER 工具
用SNIFFER 發包時,有兩種方式,一種是直接利用Packet Generator 工具,從0 開始用
16 進制的方式造一個數據包,這種方法難度較高,因為要自己算出校驗和,除非需要重現
在網路上抓到的一個16 進制格式的數據包,另外一種方式是利用已經抓到的數據包修改一
下,再發送出去,具體實現方法分別如下。
2.3.1. 利用Packet Generator 直接造包
在SNIFFER 中,選擇Tools|Packet Generator 菜單,系統彈出窗口如下:
按圖中的紅色框中的按鈕,系統會彈出一個構造包內容的對話框,如下所示:
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第13 頁共14 頁
在上圖中可輸入包的內容,還可規定發包的個數和包的長度。
2.3.2. 利用已抓的包發包
利用已抓的包進行修改,可以避免大量的運算和輸入,只需要更改自己需要更改的地方,
然後發出去即可。
如上圖所示,按包的大致要求,用其他工具造好包後,用SNIFFER 抓包,或者直接將
網路上的可疑包抓過來,然後,用滑鼠郵件單擊該包,彈出如上圖所示的快捷菜單,從中選
擇Send Current Frame 菜單,系統就會彈出如下圖所示的發包窗口:
AntPower 版權所有&; 2003 技術文章
http://www.antpower.org 第14 頁共14 頁
按要求更改包的內容,即可發送。需要注意的是如果更改了IP 地址或其他頭中的內容,
則需要更新校驗和,對MAC 或選項的更改不需要更改校驗和。
3. 總結
通過對比前面的三種發包工具,我們發現每種工具都有自己的優點和缺點,SENDIP 比
較短小而且功能較齊全,比較適合在日常測試中使用,SNIFFER 發包工具最自由,可以發
出任何可能的數據包,NESSUS 工具功能比較全面,但在發包方面不如SENDIP,所以,建
議如果是測試需要的話,應該採用SENDIP 和SNIFFER 相結合的方式,如果同時還要使用
掃描等其他功能,可以採用NESSUS 工具。
4. pcap文件可讀性差
Pcap文件詳解
一、簡介
pcap文件是常用的數據報存儲格式,可以理解為就是一種文件格式,只不過裡面的數據是按照特定格式存儲的,所以我們想要解析裡面的數據,也必須按照一定的格式。
普通的記事本打開pcap文件顯示的是亂碼,用安裝了HEX-Editor插件的Notepad++打開,能夠以16進制數據的格式顯示,或者使用sublime打開以十六進制的格式顯示。用wireshark這種抓包工具就可以正常打開這種文件,愉快地查看裡面的網路數據報了,同時wireshark也可以生成這種格式的文件。
還有一些其他網路分析工具。
二、文件格式
Pcap header
Packet1 header
Packet1 Data
Packet2 header
Packet2 Data
如上圖所示,pcap文件的總體結構就是文件頭-數據包頭1-數據包1-數據包頭2-數據包2的形式
1.Pcap Header
文件頭,每一個pcap文件只有一個文件頭,總共佔24(B)位元組,以下是總共7個欄位的含義。(一個位元組可以由2個十六進製表示)
Magic(4B):標記文件開始,並用來識別文件和位元組順序。值可以為0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原來的順序一個位元組一個位元組的讀,如果是0xd4c3b2a1表示小端模式,下面的位元組都要交換順序。現在的電腦大部分是小端模式。
ps:網路位元組序一般是大端存儲,主機x86位元組序一般是小端存儲,比如我們經過網路發送0x12345678這個整形,在80X86平台中,它是以小端法存放的,在發送前需要使用系統提供的htonl將其轉換成大端法存放
Major(2B):當前文件的主要版本號,一般為0x0200
Minor(2B):當前文件的次要版本號,一般為0x0400
ThisZone(4B):當地的標准事件,如果用的是GMT則全零,一般全零
SigFigs(4B):時間戳的精度,一般為全零
SnapLen(4B):最大的存儲長度,該值設置所抓獲的數據包的最大長度,如果所有數據包都要抓獲,將該值設置為65535(0xFFFF); 例如:想獲取數據包的前64位元組,可將該值設置為64
LinkType(4B):鏈路類型
2.Packet Header
數據包頭可以有多個,每個數據包頭後面都跟著真正的數據包。數據包頭則依次為:時間戳(秒)、時間戳(微妙)、抓包長度和實際長度,依次各佔4個位元組。以下是Packet Header的4個欄位含義
Timestamp(4B):時間戳高位,精確到seconds,這是Unix時間戳。捕獲數據包的時間一般是根據這個值
Timestamp(4B):時間戳低位,能夠精確到microseconds
Caplen(4B):當前數據區的長度,即抓取到的數據幀長度,由此可以得到下一個數據幀的位置。
Len(4B):離線數據長度,網路中實際數據幀的長度,一般不大於Caplen,多數情況下和Caplen值一樣
3.Packet Data
Packet是鏈路層的數據幀,長度就是Packet Header中定義的Caplen值,所以每個Packet Header後面都跟著Caplen長度的Packet Data。也就是說pcap文件並沒有規定捕獲的數據幀之間有什麼間隔字元串。Packet數據幀部分的格式就是標準的網路協議格式了。
例子:
紅色部分是Pcap Header,藍色部分是Packet Header,後邊是Packet Date
Pcap Header的Magic:d4 c3 b2 a1,表示是小端模式,後面的位元組從後往前讀 a1b2c3d4 小端模式
Pcap Header的Major:02 00,計算機讀的應該是00 02。最大存儲長度SnapLen:ff ff 00 00 ,同理計算機讀的應該是00 00 ff ff,所以是2的16次方減一,是65535個位元組。LinkType:01 00 00 00 ,實際是00 00 00 01,是乙太網類型。
藍色部分的Packet Header我就不一一說了,重點關注Caplen:3c 00 00 00,計算機讀的是00 00 00 3c,轉換成十進制就是60,所以後面的60個位元組都是一個數據幀。之後就又是一個Pcap Header,如此循環。
三、乙太網幀(Ethernet)、IP包、TCP、UDP的長度范圍
1、乙太網幀
MAC地址則是48位的(6個位元組),通常表示為12個16進制數,每2個16進制數之間用冒號隔開,如08:00:20:0A:8C:6D就是一個MAC地址。
乙太網地址頭部:目的地址(6位元組)、源地址(6位元組)、乙太網類型(2位元組)
目前乙太網幀有5種,交換機之間BPDU(橋協議數據單元)數據包使用的是IEEE802.3/LLC幀,其格式如下:
欄位 長度(位元組) 目的
前導碼(Preamble) 7 0x55,一串1、0間隔,用於信號同步
幀開始符(SFD) 1 1位元組0xD5(10101011),表示一幀開始
目的MAC地址 6 指明幀的接受者
源MAC地址 6 指明幀的發送者
長度(Length)/類型(Type) 2 0~1500保留為長度域值,1536~65535保留為類型域值(0x0600~0xFFFF)
數據和填充(Data and Pad) 46~1500 高層的數據,通常為3層協議數據單元。對於TCP/IP是IP數據包(註:如果幀長小於64位元組,則要求「填充」,以使這個幀的長度達到64位元組)
幀校驗序列(FCS) 4 使用CRC計算從目的MAC到數據域這部分內容而得到的校驗和
乙太網MAC幀格式
在Linux中,乙太網幀頭部的結構體如下:
/ 10Mb/s ethernet header /
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; / destination eth addr /
u_int8_t ether_shost[ETH_ALEN]; / source ether addr /
u_int16_t ether_type; / packet type ID field /
} __attribute__ ((__packed__));
其中的ETH_ALEN為6,因為地址為6個位元組,共48位——這個地址就是常說的物理地址,或MAC地址。它的第3個成員ether_type是以太幀類型,有如下這些:
/ Ethernet protocol ID's /
#define ETHERTYPE_PUP 0x0200 / Xerox PUP /
#define ETHERTYPE_SPRITE 0x0500 / Sprite /
#define ETHERTYPE_IP 0x0800 / IP /
#define ETHERTYPE_ARP 0x0806 / Address resolution /
#define ETHERTYPE_REVARP 0x8035 / Reverse ARP /
#define ETHERTYPE_AT 0x809B / AppleTalk protocol /
#define ETHERTYPE_AARP 0x80F3 / AppleTalk ARP /
#define ETHERTYPE_VLAN 0x8100 / IEEE 802.1Q VLAN tagging /
#define ETHERTYPE_IPX 0x8137 / IPX /
#define ETHERTYPE_IPV6 0x86dd / IP protocol version 6 /
#define ETHERTYPE_LOOPBACK 0x9000 / used to test interfaces /
註:如果幀長小於64位元組,則要求「填充」,以使這個幀的長度達到64位元組
但是我們觀察到這個乙太網幀只有60位元組,why?
據RFC894的說明,乙太網封裝IP數據包的最大長度是1500位元組(所以,數據鏈路層的最大傳輸單元(Maximum Transmission Unit,MTU)是1500位元組),也就是說乙太網最大幀長應該是乙太網首部加上1500,再加上7位元組的前導同步碼和1位元組的幀開始定界符,具體就是:7位元組前導同步嗎+1位元組幀開始定界符+6位元組的目的MAC+6位元組的源MAC+2位元組的幀類型+1500+4位元組的FCS。
按照上述,最大幀應該是1526位元組,但是實際上我們抓包得到的最大幀是1514位元組,為什麼不是1526位元組呢?原因是當數據幀到達網卡時,在物理層上網卡要先去掉前導同步碼和幀開始定界符,然後對幀進行CRC檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬體地址是否符合自己的接收條件(目的地址是自己的物理硬體地址、廣播地址、可接收的多播硬體地址等),如果符合,就將幀交「設備驅動程序」做進一步處理。這時我們的抓包軟體才能抓到數據,因此,抓包軟體抓到的是去掉前導同步碼、幀開始分界符、FCS之外的數據,只留下了目的地址,源地址,類型欄位,其最大值是6+6+2+1500=1514。
乙太網規定,乙太網幀數據域部分最小為46位元組,也就是乙太網幀最小是6+6+2+46+4=64。除去4個位元組的FCS,因此,抓包時就是60位元組。當數據欄位的長度小於46位元組時,MAC子層就會在數據欄位的後面填充以滿足數據幀長不小於64位元組。由於填充數據是由MAC子層負責,也就是設備驅動程序。不同的抓包程序和設備驅動程序所處的優先層次可能不同,抓包程序的優先順序可能比設備驅動程序更高,也就是說,我們的抓包程序可能在設備驅動程序還沒有填充不到64位元組幀的時候,已經捕獲了數據。因此不同的抓包工具抓到的數據幀的大小可能不同。(比如,wireshark抓到的可能沒有填充數據段,而sniffer抓到的就有填充數據段)
2、IP數據包
IP頭大小最小為20位元組。所以,網路層的MTU=數據鏈路層的MTU1500-20=1480位元組。
由於IP協議提供為上層協議分割和重組報文的功能,在IP頭中,用2個位元組來描述報文的長度,2個位元組所能表達的最大數字就是65535。所以,IP數據包的最大長度就是64K位元組(65535)。
3、TCP(傳輸層)
TCP頭部選項是一個可變長的信息,這部分最多包含40位元組,因為TCP頭部最長60位元組,(其中還包含前面20位元組的固定部分)。
依靠IP協議提供的報文分割和重組機制,TCP包頭中就沒有「包長度」欄位,而完全依靠IP層去處理分幀。這就是為什麼TCP常常被稱作一種「流協議」的原因,開發者在使用TCP服務的時候,不必去關心數據包的大小,只需講SOCKET看作一條數據流的入口,往裡面放數據就是了,TCP協議本身會進行擁塞/流量控制。
選項和填充,n4位元組,常見的可選欄位是最長報文大小 MSS(Maximum Segment Size) 。每個連接方通常都在通信的第一個報文段(為建立連接而設置 SYN 標志的那個段)中指明這個選項,它指明本端所能接收的最大長度的報文段。選項長度不一定是 32 位字的整數倍,所以要加填充位,使得報頭長度成為整字數
MTU和MSS值的關系:MTU=MSS+IP Header+TCPHeader
通信雙方最終的MSS值=較小MTU-IP Header-TCP Header
4、UDP(傳輸層)
UDP包的首部要佔用8位元組,因為UDP提供無連接服務,它的數據包包頭,是固定長度的8位元組,不存在可選欄位,可以減少很多傳輸開銷,所以它無需使用首部欄位長,因為它的首部就是固定的。
UDP則與TCP不同,UDP包頭內有總長度欄位,同樣為兩個位元組,因此UDP數據包的總長度被限制為65535,這樣恰好可以放進一個IP包內,使得 UDP/IP協議棧的實現非常簡單和高效。
所以UDP包的最大值是:IP數據包的最大長度65535-IP頭的大小20-UDP頭的大小=65507位元組。最小值是0。
這個值也就是你在調用getsockopt()時指定SO_MAX_MSG_SIZE所得到返回值,任何使用SOCK_DGRAM屬性的socket,一次send的 數據都不能超過這個值,否則必然得到一個錯誤。
————————————————
版權聲明:轉載
參考鏈接:
https://blog.csdn.net/buside/article/details/92802959?utm_medium=distribute.pc_relevant.none-task-blog--1.control&dist_request_id=1328655.9369.16158574515802585&depth_1-utm_source=distribute.pc_relevant.none-task-blog--1.control
https://blog.csdn.net/ytx2014214081/article/details/80112277
https://www.cnblogs.com/caoguoping100/p/3658792.html
https://www.cnblogs.com/sinferwu/articles/7615276.html
原文鏈接:https://blog.csdn.net/qq_33344148/article/details/114929274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166962502316800184133845%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166962502316800184133845&biz_id=0&utm_me
文章知識點與官方知識檔案匹配
演算法技能樹首頁概覽
35079 人正在系統學習中
打開CSDN APP,看更多技術內容
C++ 解析pcap文件_c++ pcap_fulianzhou的博客
#ifndef _PCAP_PARSER_H_ #define _PCAP_PARSER_H_ #include <stdint.h> #pragma pack(1) //pacp文件頭結構體 struct pcap_file_header { uint32_t magic; /* 0xa1b2c3d4 */ uint16_t version_major; /* magjor Versi...
繼續訪問
Proxysql--靈活強大的MySQL代理層_kaifly的博客_proxysql
~]# date; service iptables restart; tcpmp -i em2 host 192.168.1.34 and port 3306 and host not 192.168.1.10 -w /tmp/sysbench-proxysql-network-issue.pacp 發現,sysbench「一直」在重傳由於iptables新規則而無法返回的幾個請...
繼續訪問
網路安全系列-二十五: PCAP文件格式詳解及讀取PCAP文件源碼示例
在Linux里,pcap是一種通用的數據流格式,是用於保存捕獲的網路數據的一種非常基本的格式。 很多開源的項目都使用這種數據格式,如wireshark、tcpmp、scapy、snort 本文針對pcap的文件格式進行詳解,並提供讀取pcap文件的源代碼示例
繼續訪問
使用wireshark分析tcpmp出來的pcap文件
個人認為tcpmp+wireshark是很精確的,之前在網上查閱移動端流量測試,大多講tcpmp這部分很精細,但是沒有講到詳細使用wireshark分析tcpmp到的.pcap文件,這里做一個詳細的講解,僅供大家參考。 本人wireshark版本是V 2.2.1。tcpmp到的.pcap文件可以直接雙擊打開(默認打開方式為wireshark,或者你在wireshark中選擇打開文件也可以),抓取到的數據包很多,我們需要過濾一些想要的數據,那麼在如圖所示的輸入框中輸入表達式過濾即可: Wire
繼續訪問
2020-2021項目遇到的部分問題 編程語言C++ 編程軟體QT_Qingshan_z的博...
4.需要點擊安裝Win10Pacp文件夾中的對應內容。 更改編譯器後,程序中文字元報錯顯示,包含換行符等字元顯示錯誤 改兩個地方: 改編碼為UTF-8:編輯—Select Encoding—UTF-8—按編碼保存 工具—選項—文本—行為—UTF-8—如果是UTF-8添加...
繼續訪問
BGP路由器協議排錯教程:與平台相關的數據包捕獲工具_AMZ學術的博客-CSDN...
注釋 分析 EPC 捕獲信息最簡單的方式是把這些信息導出到遠端伺服器,並使用Wireshark 讀取導出的.pacp 文件 2.5.3 Ethanalyzer Ethanalyzer 是 NX-OS 中的 TShark 實現。TShark 是終端版本的 Wireshark。它可以在所有 Nexus 平台上捕獲帶...
繼續訪問
linux 下 tcpmp 詳解 前篇(libpcap庫源碼分析)
一 概述 用簡單的話來定義tcpmp,就是:mp the traffic on a network,根據使用者的定義對網路上的數據包進行截獲的包分析工具。 至於tcpmp參數如何使用,這不是本章討論的重點。 liunx系統抓包工具,毫無疑問就是tcpmp。而windows的抓包工具,wireshark也是一款主流的抓包工具。wireshark 使用了winpcap庫。tcpmp...
繼續訪問
pcap抓包庫部分函數說明
學習通過偵聽網卡獲取報文的程序,遇到部分pacp抓包庫中的函數,在查閱資料後,作以下整理說明: 1. pcap_next_ex(): 基於非回調函數的捕獲數據包,參數有三個,一個網卡描述符,兩個指針,兩個指針會被初始化並返回給用戶,一個是pcap_pkthdr結構,一個是接收數據的緩沖區。pcap_pkthdr結構如下所示: struct pcap_pkthdr { struc
繼續訪問
網路安全、Web安全、滲透測試之筆經面經總結(二)_普通網友的博客-CSD...
在Unix/Linux平台上,可以直接使用Socket構造IP包,在IP頭中填上虛假的IP地址,但需要root許可權;在Windows平台上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系統,首先打開一個Raw Socket(原始套接字),然後自己編寫IP...
繼續訪問
Linux_liubo525的博客
文件-新建虛擬機-典型-稍後安裝操作系統-Linux+版本-虛擬機名稱-默認最大磁碟大小+存儲為單個文件2)安裝CentOS操作系統CD/DVD-使用ISO鏡像文件-選擇下載好了的ISO文件-打開虛擬機(開始安裝虛擬機)...
繼續訪問
vlan 報文抓包.pcap
vlan報文,用於文檔資源,學習vlan協議的時,可以下載看一下。
Pcap 數據包捕獲格式詳解
Pcap 是 Packet Capture 的英文縮寫,是一種行業標準的網路數據包捕獲格式。如果你是網路開發人員,那麼通常會使用 Wireshark、Tcpmp 或 WinDump 等網路分析器捕獲 TCP/IP 數據包,而抓包後存檔的文件格式就是 .pcap 文件。 文件格式 Pcap 文件格式是一種二進制格式,支持納秒級精度的時間戳。雖然這種格式在不同的實現中有所不同,但是所有的 pcap 文件都具有如下圖所示的一般結構。 全局報頭 全局報頭(Global Header)包含魔數(Magic nu
繼續訪問
滲透測試工程師面試題大全(164道)_Kal1的博客_滲透測試...
14.拿到一個 webshell 發現網站根目錄下有.htaccess 文件,我們能做什麼? 能做的事情很多,用隱藏網馬來舉例子: 插入<FilesMatch 「xxx.jpg」> SetHandler application/x-httpd-php .jpg 文件會被解析成.php 文件 15.注入漏洞只能查賬...
繼續訪問
dm 數據引流工具_hu5350026的博客_數據引流
log :該應用程序的日誌記錄文件存放的目錄; third :該應用程序依賴的第三方 jar 文件存放的目錄; wapper :該應用程序以服務方式啟動包裝文件的存放目錄; service_start.bat/sh :該應用程序以服務方式啟動時的啟動服務腳本文件; ...
繼續訪問
MISC:流量包取證(pcap文件修復、協議分析、數據提取)
滑鼠協議:每一個數據包的數據區有四個位元組,第一個位元組代表按鍵,當取 0x00 時,代表沒有按鍵、為 0x01 時,代表按左鍵,為 0x02 時,代表當前按鍵為右鍵。第二個位元組可以看成是一個 signed byte 類型,其最高位為符號位,當這個值為正時,代表滑鼠水平右移多少像素,為負時,代表水平左移多少像素。HTTPs = HTTP + SSL / TLS. 服務端和客戶端的信息傳輸都會通過 TLS 進行加密,所以傳輸的數據都是加密後的數據。但是,如果採用主動模式,那麼數據傳輸埠就是 20;
繼續訪問
c語言判斷pcap文件結尾,PCAP文件擴展名 - 什麼是.pcap以及如何打開? - ReviverSoft...
你在這里因為你有,有一個文件擴展名結尾的文件.pcap.文件與文件擴展名.pcap只能通過特定的應用程序推出。這有可能是.pcap文件是數據文件,而不是文件或媒體,這意味著他們並不是在所有觀看。什麼是一 .pcap 文件?該.pcap文件擴展名主要使用Wireshark相關;用於分析網路的程序。 .pcap文件是使用程序創建的數據文件,並且它們包含的...
繼續訪問
UEBA架構設計之路1_lionzl的博客
Tcpmp,tcpflow生成的pacp或流數據,以及其他數據包級和session級信息 性能下降,超時,瓶頸或可疑活動,表明網路可能受到威脅或遠程攻擊 Syslog 路由、交換、其他網路設備 故障、分析、安全審計 WEB訪問日誌 WEB伺服器 WEB分析 PROXY日...
繼續訪問
pcap文件解析--pcap文件頭與包文件頭(一)
初識Pcap文件 在開始讀取pcap文件之前,先讓我們來看看Pcap文件的大概結構。 如上圖所示在一個Pcap文件中存在1個Pcap文件頭和多個數據包,其中每個數據包都有自己的頭和包內容。 下面我們先看看PCAP文件頭每個欄位是什麼意思: magic為文件識別頭,pcap固定為:0xA1B2C3D4。(4個位元組) magor version為主版本號(2個
繼續訪問
pcap文件linux怎麼打開,pcap文件用什麼打開
linux 應用 pcap文件怎麼打開如果你是一個測試入侵偵測系統或一些網路訪問控制策略的網路管理員,那麼你經常需要抓取數據包並在離線狀態下分析這些文件。當需要保存捕獲的數據包時,我們一般會存儲為 libpcap 的數據包格式 pcap,這是一種被許多開源的嗅探工具以及捕包程序請問用什麼軟體打開*.pcap格式的文件?CSS布局HTML小編今天和大家分享解wireshark 怎麼打不開pcap文件...
繼續訪問
Wireshark網路分析實戰——Wireshark的安裝和抓包
一、Wireshark簡介 本節涵蓋以下內容: 安置Wireshark(主機/程序); 開始抓包; 本書的前言曾提到過網路排障以及內置於Wireshark能幫助排障的各種工具。一旦決定動用Wireshark協議分析軟體,在使用之前,則有必要先確定該軟體在網路中的部署(或安裝)位置。除此之外,還得對該軟體做一些基本的配置,至少應讓其界面看起來更為友好。 用Wireshark執行基本的抓包操作,配置起來並不麻煩,但是該軟體也包含了很多高級配置選項,可用來應對某些特殊情況。這樣的特殊情況包括令Wireshar
繼續訪問
學習筆記——C++實現ARP欺騙
以下代碼大體上是沒有問題的,可以根據自己的一些需求進行修改! 謝謝指正錯誤 在課設期間,從網上學習了簡單的實現ARP欺騙 ARP欺騙的原理很簡單:通過不斷的向目標發送ARP包,致使目標主機的ARP緩存表中正確的IP映射的是錯誤的MAC地址 在書上的介紹中,採用了WinPcap的開發包,這樣很方便的對網卡進行操作 所以,首先需要安裝winpacp,並下載開發者包https://www......
繼續訪問
熱門推薦 pcap文件格式及文件解析
第一部分:PCAP包文件格式 一 基本格式: 文件頭 數據包頭數據報數據包頭數據報...... 二、文件頭: 文件頭結構體 sturct pcap_file_header { DWORD magic; DWORD version_major; DWORD ve
繼續訪問
最新發布 pcap詳解
pcap格式及API詳解
繼續訪問
從pcap文件提取包長度序列
從pcap文件提取包長度序列 1. 抓包 在windows系統,使用wireshark抓取YY語音流數據,最好是單條鏈路單向的。數據存儲為pcap文件。 2. 格式轉換 在linux系統終端,使用tcpmp命令把pcap文件轉成txt文件。 命令為:tcpmp -r input.pcap > output.txt 3. 提取 在windows系統,使用matlab從轉
繼續訪問
Ethernet Packet 解析
目錄 引言 引言 接上篇文章 Pcap文件格式 ,我們分析了Pcap文件的global Header 和 Pcap Packet Header現在來分析一下Pcap Data。因為global Header 定義的 network 01 為 ETHERNET, 所以這篇文章來分析一下Pcap Data為Ethernet Packet類型的數據。 Ethernet Packet 結構 參考文檔 Ethernet_frame--wikipedia IEEE_802.1.
繼續訪問
pcap包解析
pacp包解析 在接觸激光雷達的時候,不可避免的第一步就是看硬體說明書以及調試廠商發的樣例數據。一般情況下,廠商在存儲硬體的數據包的時候,都是通過存儲pacp包實現的,所以如何讀取pacp包,並從中解析出真正有用的數據就變得很重要,接下來我們一步步講。 1.pacp包結構 一個Pcap文件包括「Pcap報頭」,「數據區」兩個部分,其中數據區又分成多個數據包,每個包有報頭和數據兩個部分,總體結構可見...
繼續訪問
pcap文件內容保存為csv文件
將pcap文件內容導出為csv文件
繼續訪問
pacp文件讀取緩存
5. VB的截取封包和發送封包源碼
參考資料:VB截取封包 關於VB開發外掛 尤其是API HOOK方面的分歧較多 其實vb做外掛一點也不遜色!
上過MSDN的開發者都知道 vb vc c# vj的樣例是統一的 僅僅是語法表達不一樣罷了!也就是說用VC寫的功能 同樣也能用VB寫出來!
下面提供一段VB利用API截獲RAW SOCKET封包的代碼,請不吝賜教!
Dim soc As Long, dwRc As Long
Dim RemoteAddr As sockaddr
Dim LocalAddr As sockaddr
Dim inBuffer, outBuffer As String
Dim byteReturn As Long
Dim RetMsg As String
Dim strData As String
Dim nReceived As Long
Const MAX_PACK_LEN = 4096
Dim keepRun As Boolean
Dim asc() As Byte
Private Type TcpHeader 'typedef struct tcp_hdr //定義TCP首部
th_sport As Integer '; //16位源埠
th_dport As Integer '; //16位目的埠
th_seq As Long '; //32位序列號
th_ack As Long '; //32位確認號
th_lenres As Byte '; //4位首部長度/6位保留字
th_flag As Byte '; //6位標志位
th_win As Integer '; //16位窗口大小
th_sum As Integer '; //16位校驗和
th_urp As Integer '; //16位緊急數據偏移量
End Type
........ 資料地址: http://hi..com/zyq0ting/blog/item/ab10783eca88783b70cf6ceb.html