封包的擷取與解包 1

2021-03-31 08:56:31 字數 3440 閱讀 9691

網路資料報偵聽基本原理:*/

#include

#include

#include

#include

#include

#define status_failed 0xffff  //定義異常出錯**

#define max_pack_len  65535   //接收的最大ip報文 

#define max_addr_len  16   //點分十進位制位址的最大長度

#define max_proto_text_len 16  //子協議名稱(如"tcp")最大長度

#define max_proto_num 12   //子協議數量

#define max_hostname_lan 255  //最大主機名長度

#define cmd_param_help true

handle hfile = null;

handle hparse = null;

typedef struct _iphdr

ip_header;

typedef struct _tcphdr    //定義tcp首部

tcp_header;

typedef struct _udphdr    //定義udp首部

udp_header;

typedef struct _icmphdr    //定義icmp首部

icmp_header;

typedef struct _protomap   //定義子協議對映表

protomap;

protomap protomap[max_proto_num]=,

,  ,

,  , 

,  , 

,  , 

,  ,

};socket sockraw;

char tcpflag[6]=; //定義tcp標誌位

bool paramtcp =false;    // -t關注tcp 報文

bool paramudp =false;    // -u關注udp 報文 

bool paramicmp =false;    // -i關注icmp報文

bool paramdecode=false;    // -d對協議進行解碼

char *strfromipfilter=null;   // 源ip位址過濾

char *strdestipfilter=null;   // 目的位址過濾

char *strsensitive=null;   // 敏感字串

int  iportfilter=0;     // 埠過濾

int iprotocol, ittl;    

char szprotocol[max_proto_text_len];

char szsourceip[max_addr_len], szdestip[max_addr_len];

int decodeippack(char *, int);  //ip解包函式

int decodetcppack(char *, int);  //tcp解包函式

int decodeu***ack(char *, int);  //udp解包函式

int decodeicmppack(char *, int); //icmp解包函式

void checksockerror(int, char*); //出錯處理函式

char * checkprotocol(int);   //協議檢查

void usage(void);     //使用說明

bool getcmdline(int, char **);  //命令列引數處理

void main(int argc, char ** argv)

;usage();

if(getcmdline(argc, argv)==cmd_param_help) exit(0);

//初始化socket

wsadata wsadata;

ierrorcode = wsastartup(makeword(2,1),&wsadata);

checksockerror(ierrorcode, "wsastartup");

sockraw = socket(af_i*** , sock_raw , ipproto_ip);

checksockerror(sockraw, "socket");

//獲取本機ip位址

char far name[max_hostname_lan];

ierrorcode = gethostname(name, max_hostname_lan);

checksockerror(ierrorcode, "gethostname");

struct hostent far * phostent;

phostent = (struct hostent * )malloc(sizeof(struct hostent));

phostent = gethostbyname(name);

sockaddr_in sa;

sa.sin_family = af_i***;

sa.sin_port = htons(6000);

memcpy(&sa.sin_addr.s_un.s_addr, phostent->h_addr_list[0], phostent->h_length);

free(phostent);

ierrorcode = bind(sockraw, (psockaddr)&sa, sizeof(sa));

checksockerror(ierrorcode, "bind");

//設定sock_raw為sio_rcvall,以便接收所有的ip包

dword dwbufferlen[10] ;

dword dwbufferinlen = 1 ;

dword dwbytesreturned = 0 ;

ierrorcode=wsaioctl(sockraw, sio_rcvall,&dwbufferinlen, sizeof(dwbufferinlen),            

&dwbufferlen, sizeof(dwbufferlen),&dwbytesreturned , null , null );

checksockerror(ierrorcode, "ioctl");

//偵聽ip報文

while(1)

::closehandle(hfile);

::closehandle(hparse);

}//ip解包程式

int decodeippack(char *buf, int ibufsize)

//printf("/n");

return true;

}//協議識別程式

char * checkprotocol(int iprotocol)

解包kwargs python的封包與解包

將多個值賦值給乙個變數時,python會自動將這些值封裝成元組,這個特性稱之為封包 a 1,2,3 print a,type a 1,2,3 當函式返回多個數值時,也會進行封包 def test return 1,2,3 a test print a,type a 1,2,3 實踐中,很少主動使用封...

Python 序列封包與序列解包

什麼叫做序列?序列可以理解為可以進行切片 相加相乘 索引 成員資格 用關鍵字in not in關鍵字判斷某個元素在不在這個序列 例如 列表 元組 字串就是常見的序列。python中內建的三種資料結構 列表 元組 字典,只有字典不是序列 序列封包例 序列封包,把多個值賦給乙個變數 a 1,2,3 pr...

python元祖封包 python的封包與解包

python的封包與解包 1.python 封包 將多個值賦值給乙個變數時,python會自動將這些值封裝成元組,這個特性稱之為封包 a 1,2,3 print a,type a 1,2,3 當函式返回多個數值時,也會進行封包 def test return 1,2,3 a test print a...