欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:網(wǎng)絡 利用原始套接字的抓包原理

柚子快報激活碼778899分享:網(wǎng)絡 利用原始套接字的抓包原理

http://yzkb.51969.com/

利用原始套接字的抓包原理:

抓包層

發(fā)送接收ip數(shù)據(jù)包 【接收除了以太網(wǎng)幀頭部后面的ip層數(shù)據(jù)】 socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP) 發(fā)送接收以太網(wǎng)數(shù)據(jù)幀數(shù)據(jù)包 【接收包括以太網(wǎng)幀頭部的所有 以太網(wǎng)幀層的所有數(shù)據(jù)】 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)) 參數(shù)說明: 1)AF_INET和PF_PACKET的區(qū)別 使用AF_INET可以接收協(xié)議類型為(tcp udp icmp等)發(fā)往本機的ip數(shù)據(jù)包,而使用PF_PACKET可以監(jiān)聽網(wǎng)卡上的所有數(shù)據(jù)幀。 注:創(chuàng)建原始套接字需要啟動管理員權限否則,socket會創(chuàng)建失敗

ip與端口的假象【混雜模式下端口號,IP可能都是假象】【原始套接字bind IP的目的是bind網(wǎng)卡】 然后需要為原始套接字 bind ip和端口號;這里端口號可以使用ADDR_ANY隨機指定一個;因為對于原始套接字來說 端口號只是一個假象,原始套接字可以接收所有其綁定ip對應的網(wǎng)卡適配器上面流經(jīng)的數(shù)據(jù); 所以ip也是一種假象,重要的是為原始套接字綁定一個網(wǎng)卡適配器也就是所謂的網(wǎng)口;如果一臺主機上有多個網(wǎng)口需要抓包,則需要創(chuàng)建多個套接字bind所有這些的網(wǎng)口;然后在這些套接字上監(jiān)聽抓取數(shù)據(jù)

然后設置混雜模式 SIO_RCVALL

網(wǎng)卡對數(shù)據(jù)幀進行硬過濾(根據(jù)網(wǎng)卡的模式不同采取不同的操作,如果設置了混雜模式,則不做任何過濾直接交給下一層,否則非本機mac或者廣播mac的會被直接丟棄)

DWORD dwBufferLen[10] = { 0 };

DWORD dwBufferInLen = 1;

DWORD dwBytesReturned = 0;

// 設置該SOCKET為接收所有流經(jīng)綁定的IP的網(wǎng)卡的所有數(shù)據(jù),包括接收和發(fā)送的數(shù)據(jù)包

iRet = WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen),//設置混雜模式

&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);

if (iRet != 0) {

printf("WSAIoctl failed with error %d\n", WSAGetLastError());

}

最后 可以調(diào)用iRet = recvfrom(sock, strBuffer, sizeof(strBuffer), 0, (sockaddr*)&addrFrom, &fromlen); 函數(shù)進行數(shù)據(jù)包抓取了

原始套接字抓取包的大小的決定因素

以socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP) 進行ip包的數(shù)據(jù)抓取舉例

對于ip包層來說,他不管包是TCP發(fā)的還是UDP發(fā)的,這都是上層協(xié)議;包都是ip包 原始套接字上即可以抓取由TCP發(fā)送過來的數(shù)據(jù)也可以抓取由UDP發(fā)送來的數(shù)據(jù),對于ip包來說他是不管這個包是什么包的;因為那是他的上層協(xié)議去做的事情;那么在抓包的過程中接受的包的大小由什么決定了呢

ip包層抓取的數(shù)據(jù)包大小就是對端用TCP或者UDPsend發(fā)送的長度 + 40或者28【即加上IP報頭和TCP或者UDP報頭的長度】;【另外要說一點是雖然以太網(wǎng)幀協(xié)議的數(shù)據(jù)域大小上線是1500字節(jié);如果發(fā)生端send發(fā)送的數(shù)據(jù)超過這個上線,在發(fā)送端就會對這個包進行分片;但是這一切對ip包層抓取的包來說是無感的;即在IP包層已經(jīng)重組了以太網(wǎng)幀的1500數(shù)據(jù)域,即ip包層可以突破1500的抓包】

IP包層抓包對于這二種協(xié)議的接收都不應該低于數(shù)據(jù)域+40/28【以發(fā)送端send為標準】。否則IP包層接收recvform會返回錯誤; ip包的接收緩沖區(qū)大小不能低于其接收的數(shù)據(jù)包大??;而其數(shù)據(jù)包大小=40/28 +數(shù)據(jù)域大?。贿@個數(shù)據(jù)域大小就是發(fā)送端用tcp或者udp進行數(shù)據(jù)發(fā)送時候的send的大小【注意是以發(fā)送端為標準】 所以對于ip包來說其處理接收緩沖區(qū)的方式有點類似于UDP包層的處理;但是僅僅是類似,ip包層不用管上層的協(xié)議對應的究竟是什么包;接收的大小也可以突破以太網(wǎng)幀的數(shù)據(jù)域大?。贿@就是協(xié)議棧分離效果的體現(xiàn)

從這點我們也可以來理解上層UDP/tcp的接收行為;【在udp層udp接受緩沖區(qū)必須不小于發(fā)生端包長度,TCP層可以流式接收】

對于udp來說很好理解,udp發(fā)送端發(fā)送的數(shù)據(jù)包大小就是其udp接收端接收的數(shù)據(jù)包大??;也是抓包時 ip數(shù)據(jù)包的大小的數(shù)據(jù)域組成;=>抓包接收的大小是ip包=28+udp包 但是對于tcp來說在傳輸層面上,tcp是流式協(xié)議,接收方的tcp 可以一個一個字節(jié)接收;可以一次性接收都可以;但是這跟ip包的接收recvform得到的大小無關;=>其ip抓包的大小是=40+tcp發(fā)送端發(fā)送的大小 所以用普通流式套接字你是可以一個一個的接收;但是原始套接字抓包,必須要提供的接收緩沖區(qū)不小于 20 + 20/8 +數(shù)據(jù)域大小 【數(shù)據(jù)域大小可能是0】

示例代碼:

#include

#include

#include "protocol.h"

#pragma comment(lib,"WS2_32.lib")

#define _WINSOCK_DEPRECATED_NO_WARNINGS

using namespace std;

WsaInit Init;

// 使用原始套接字抓取網(wǎng)卡數(shù)據(jù)包

int capturenetpackage()

{

// 此處必須以管理員運行VS,否則返回10013

SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); //處理 ip

if (sock == SOCKET_ERROR) {

printf("socket failed with error %d\n", WSAGetLastError());

exit(-1);

}

char strHostName[255];

int iRet = gethostname(strHostName, sizeof(strHostName));

if (iRet != 0) {

printf("gethostname failed with error %d\n", WSAGetLastError());

exit(-1);

}

// 根據(jù)主機名取得主機地址

hostent* pHostent = gethostbyname(strHostName);

// getaddrinfo()

sockaddr_in addrSelf;

addrSelf.sin_family = AF_INET;

addrSelf.sin_port = htons(ADDR_ANY);//端口是假象

memcpy(&addrSelf.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

char szip[32]{};

for (int i = 0; pHostent->h_addr_list[i] != 0; ++i)

{

addrSelf.sin_addr.s_addr = *(u_long*)pHostent->h_addr_list[i];

inet_ntop(AF_INET, &addrSelf.sin_addr, szip, 32);

//printf("\tIPv4 Address %d: %s\n", i, szip);

}

printf("self local ip addr is %s\n", szip);

iRet = bind(sock, (PSOCKADDR)&addrSelf, sizeof(addrSelf));//bind網(wǎng)口 //ip也是假象 關鍵在于網(wǎng)口

if (iRet != 0) {

printf("bind failed with error %d\n", WSAGetLastError());

exit(-1);

}

DWORD dwBufferLen[10] = { 0 };

DWORD dwBufferInLen = 1;

DWORD dwBytesReturned = 0;

// 設置該SOCKET為接收所有流經(jīng)綁定的IP的網(wǎng)卡的所有數(shù)據(jù),包括接收和發(fā)送的數(shù)據(jù)包

iRet = WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen),

&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);

if (iRet != 0) {

printf("WSAIoctl failed with error %d\n", WSAGetLastError());

}

//14+20 +20 14+20+8

sockaddr_in addrFrom;

int fromlen = sizeof(addrFrom);

time_t temp;

char strFromIP[16]{};

char strCurTime[32]{};

char strBuffer[35]{};

char strData[4096] { };

IPHeader ipData;

TCPHeader tcpData;

UDPHeader udpData;

NetData netData;

while (true)

{

memset(strBuffer, 0, sizeof(strBuffer));

iRet = recvfrom(sock, strBuffer, sizeof(strBuffer), 0, (sockaddr*)&addrFrom, &fromlen);

if (iRet <= 0) {

printf("recv failed with error %d\n", WSAGetLastError());

continue;

}

char szTemp[32]{};

inet_ntop(AF_INET, &addrFrom.sin_addr, szTemp, 32);

strcpy(strFromIP, szTemp);

// if(strcmp(strFromIP, "192.168.0.104") == 0

// || strcmp(strFromIP, "192.168.0.1") == 0

// || strcmp(strFromIP, "192.168.0.103") == 0){

// continue;

// }

/*if (strcmp(strFromIP, "192.168.37.1") != 0) { //設置一種邏輯過濾

continue;

}*/

// 處理IP包頭數(shù)據(jù)

memcpy(&ipData, strBuffer, sizeof(ipData));

BYTE Protocol = 0;

sockaddr_in addrSrc, addrDst;

char strSrcIP[16] = { 0 }, strDstIP[16] = { 0 };

addrSrc.sin_addr.S_un.S_addr = ipData.SrcAddr;

addrDst.sin_addr.S_un.S_addr = ipData.DstAddr;

inet_ntop(AF_INET, &addrSrc.sin_addr, szTemp, 32);

strcpy(strSrcIP, inet_ntoa(addrSrc.sin_addr));

inet_ntop(AF_INET, &addrDst.sin_addr, szTemp, 32);

strcpy(strDstIP, inet_ntoa(addrDst.sin_addr));

/*if (strcmp(strSrcIP, "192.168.0.104") != 0 || strcmp(strDstIP, "192.168.0.104") != 0) { //設置一種邏輯過濾

continue;

}*/

int iSrcPort = 0;

int iDstPort = 0;

// UDP協(xié)議

if (ipData.Protocol == IPPROTO_UDP)

{

/*if (iRet != 1052) {

continue;

}*/

memcpy(&udpData, strBuffer + sizeof(ipData), sizeof(udpData));

iSrcPort = ntohs(udpData.SrcPort);

iDstPort = ntohs(udpData.DstPort);

memcpy(&netData, strBuffer + sizeof(ipData) + sizeof(udpData), sizeof(netData));

}

// TCP協(xié)議

else if (ipData.Protocol == IPPROTO_TCP)

{

/*if (iRet != 1064) {

continue;

}*/

memcpy(&tcpData, strBuffer + sizeof(ipData), sizeof(tcpData));

iSrcPort = ntohs(tcpData.SrcPort);

iDstPort = ntohs(tcpData.DstPort);

memcpy(&netData, strBuffer + sizeof(ipData) + sizeof(tcpData), sizeof(netData));

}

else {}

time(&temp);

strftime(strCurTime, sizeof(strCurTime), "%Y-%m-%d %H:%M:%S", localtime(&temp));

if (ipData.Protocol == IPPROTO_TCP)

printf("TCP Catch!\n");

else if (ipData.Protocol == IPPROTO_UDP)

printf("UDP Catch!\n");

printf("pack catch Time:%s PackLength:%d\n", strCurTime, iRet);

printf("strSrcIP:%s iSrcPort:%d\n", strSrcIP, iSrcPort);

printf("strDstIP:%s iDstPort:%d\n", strDstIP, iDstPort);

}

return 0;

}

int main()

{

capturenetpackage();

return 0;

參考鏈接:https://blog.csdn.net/Toobad321/article/details/77869543 https://blog.csdn.net/caoshangpa/article/details/51530685

柚子快報激活碼778899分享:網(wǎng)絡 利用原始套接字的抓包原理

http://yzkb.51969.com/

相關鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19517310.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄