主要是为了测试时能实时捕捉和显示嵌入式设备上的数据包:
这样操作设备同时可以实时查看数据包。当然我做有配套日客户端接收程序;
编写环境:ubuntu 14 arm-linux-gcc4.4.3 libpcap库 libpcap-1.7.4.tar.gz

实现原理为登入设备telnet 然后运行抓包代码如下图是不用客户端直接登入设备:(抓包器会自动屏蔽23号telnet端口数据包防止抓包数据无限增长)

下面贴出了程序源码,欢迎大家讨论和一起学习:
XX1.c
/*########################################################
###### 日期:2016-5-1 #######
###### 作者:zhj #######
###### 作用:通过telnet进行远程网络数据包捕捉 #######
###### 版本:v1.4 #######
###### 特征:支持端口,IP,MAC,tcp,tcp长度,udp过滤 #######
########################################################*/
//过滤规则指令如下:
//tcp.len.123 tcp.len=123
//# tcp.tcp tcp 过滤
//# udp.udp udp过滤
//# tcp.len.123 表示tcp.数据区长度大于123的包
//# tcp.len=123 表示tcp.数据区长度等于123的包
//# adr.port=123 表示过滤端口为123的数据包
//# dst.port=123 表示过滤目标端口为123的数据包
//# src.port=123 表示过滤源端口为123的数据包
//# adr.ip=192.168.1.1 表示过IP口为192.168.1.1的数据包
//# dsr.ip=192.168.1.1 表示过滤目标IP为192.168.1.1的数据包
//# src.ip=192.168.1.1 表示过滤源IP为192.168.1.1的数据包
//# adr.mac=112233445566 表示过滤MAC地址为112233445566的数据包
//# dst.mac=112233445566 表示过滤目标MAC地址为112233445566的数据包
//# src.mac=112233445566 表示过滤源MAC地址为112233445566的数据包
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int dst_port[2]={0,0};
int src_port[2]={0,0};
int adr_port[2]={0,0};
short dst_mac[6]={0,0,0,0,0,0};
short src_mac[6]={0,0,0,0,0,0};
short adr_mac[6]={0,0,0,0,0,0};
int dst_ip[4]={0,0,0,0};
int src_ip[4]={0,0,0,0};
int adr_ip[4]={0,0,0,0};
int tcp_len[6]={0,0,0,0,0,0};
struct tm *p;
int dst_portb[2]={0,0};
int src_portb[2]={0,0};
short dst_macb[6]={0,0,0,0,0,0};
short src_macb[6]={0,0,0,0,0,0};
int dst_ipb[4]={0,0,0,0};
int src_ipb[4]={0,0,0,0};
int io;
time_t timep;
unsigned char jjbuf[65535],jjbufer[65535];
int jjbuflen,jjbuflock=0,forx=0;
char bb=0,tcp=0,tcplenx=0,tcplen=0,udp=0,srcport=0,dstport=0,adrport=0,srcmac=0,dstmac=0,adrmac=0,srcip=0,dstip=0,adrip=0,dec_gl=1;
/*########################################################
################# 捕捉数据包回调函数 ####################
########################################################*/
void my_callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet)//抓包回调函数——处理抓包数据
{
if(((packet[34]==0x00)&(packet[35]==0x17))|((packet[36]==0x00)&(packet[37]==0x17)))//过滤23号端口网络包(即telnet协议)防止网络数据泛滥
{
}
else
{
int Iplen=0,Tcplen=0,packetlen=0;
Iplen=((packet[14])&0x0f)<<2;//计算IP头度
if(0x06==packet[23])//TCP
{
Tcplen=((packet[26+Iplen]&0xf0)>>2);//计算TCP头长度
packetlen=(((int)packet[16])<<8)+packet[17];//计算IP包长度
}
/*#########################################################################
################### tcp长度过滤是否开启 ########################
#########################################################################*/
for(forx=0;forx<1;forx++)
{
if(tcplenx==1)//判断是否开启___tcp___长度过滤
{
if(tcplen==1){
if(0x06==packet[23]){
if((packetlen-Iplen-Tcplen)==tcp_len[0]){}//计算数据区长度
else{break;}}
else{break;}}
else{
if(0x06==packet[23]){
if((packetlen-Iplen-Tcplen)>tcp_len[0]){}//计算数据区长度
else{break;}}
else{break;}}
}
/*#########################################################################
################### 判断协议过滤是否开启 ########################
#########################################################################*/
if(tcp==1)//判断是否开启___tcp___过滤
{
if(0x06==packet[23]){}
else{break;}
}
if(udp==1)//判断是否开启___udp___过滤
{
if(0x11==packet[23]){}
else{break;}
}
/*#########################################################################
################### 判断端口过滤是否开启 ########################
#########################################################################*/
if(srcport==1)//判断是否开启___源端口___过滤
{
if((src_port[0]==packet[Iplen+14])&(src_port[1]==packet[Iplen+15])){}
else{break;}
}
if(dstport==1)//判断是否开启___目标端口___过滤
{
if((dst_port[0]==packet[Iplen+16])&(dst_port[1]==packet[Iplen+17])){}
else{break;}
}
if(adrport==1)//判断是否开启___全部端口___过滤
{
if(((adr_port[0]==packet[Iplen+16])&(adr_port[1]==packet[Iplen+17]))|((adr_port[0]==packet[Iplen+14])&(adr_port[1]==packet[Iplen+15]))){}
else{break;}
}
/*#########################################################################
#################### 判断MAC过滤是否开启 ########################
#########################################################################*/
if(srcmac==1)//判断是否开启___源MAC___过滤
{
if((src_mac[0]==packet[6])&(src_mac[1]==packet[7])&(src_mac[2]==packet[8])&(src_mac[3]==packet[9])&(src_mac[4]==packet[10])&(src_mac[5]==packet[11])){}
else{break;}
}
if(dstmac==1)//判断是否开启___目标MAC___过滤
{
if((dst_mac[0]==packet[0])&(dst_mac[1]==packet[1])&(dst_mac[2]==packet[2])&(dst_mac[3]==packet[3])&(dst_mac[4]==packet[4])&(dst_mac[5]==packet[5])){}
else{break;}
}
if(adrmac==1)//判断是否开启___全部MAC___过滤
{
if(((adr_mac[0]==packet[0])&(adr_mac[1]==packet[1])&(adr_mac[2]==packet[2])&(adr_mac[3]==packet[3])&(adr_mac[4]==packet[4])&(adr_mac[5]==packet[5]))|
((adr_mac[0]==packet[6])&(adr_mac[1]==packet[7])&(adr_mac[2]==packet[8])&(adr_mac[3]==packet[9])&(adr_mac[4]==packet[10])&(adr_mac[5]==packet[11]))){}
else{break;}
}
/*#########################################################################
##################### 判断IP过滤是否开启 ########################
#########################################################################*/
if(srcip==1)//判断是否开启___源IP___过滤
{
if((src_ip[0]==packet[26])&(src_ip[1]==packet[27])&(src_ip[2]==packet[28])&(src_ip[3]==packet[29])){}
else{break;}
}
if(dstip==1)//判断是否开启___目标IP___过滤
{
if((dst_ip[0]==packet[30])&(dst_ip[1]==packet[31])&(dst_ip[2]==packet[32])&(dst_ip[3]==packet[33])){}
else{break;}
}
if(adrip==1)//判断是否开启___全部IP___过滤
{
if(((adr_ip[0]==packet[30])&(adr_ip[1]==packet[31])&(adr_ip[2]==packet[32])&(adr_ip[3]==packet[33]))|
((adr_ip[0]==packet[26])&(adr_ip[1]==packet[27])&(adr_ip[2]==packet[28])&(adr_ip[3]==packet[29]))){}
else{break;}
}
/*#########################################################################
####################### 输出捕捉的数据包 #########################
#########################################################################*/
if(jjbuflock==0)
{
time(&timep);
jjbuflock=1;
jjbuflen=pkthdr->len;
memcpy(jjbuf,packet,jjbuflen);
p=localtime(&timep); /*取得当地时间*/
printf ("%d-%d-%d-", (1900+p->tm_year),( 1+p->tm_mon), p->tm_mday);
//时间矫正8小时
int timehour=p->tm_hour+8;
if(timehour>24){timehour-=24;}
printf("%d:%d:%d----", timehour, p->tm_min, p->tm_sec);
for(io=0;io
{
if (jjbuf[io]<16){printf("0");}
printf("%x",jjbuf[io]);
}
printf("_");
if (bb==1){printf("
");}
fflush(stdout);
jjbuflock=0;
}
}
}
}
/*########################################################
################# 字符转数字函数 ########################
########################################################*/
int ascii_int(char argc)
{
if(58>(argc))
{
argc=argc-48;
}
if(argc>96)
{
argc=argc-87;
}
return argc;
}
/*########################################################
##################### 主main函数 ##########################
########################################################*/
int main(int argc,char **argv)
{
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
int vile=-1;
pcap_t* devfd;
const u_char *packet;
struct pcap_pkthdr hdr;
struct ether_header *eptr;
char c,c1,c2=0,c3,c4,c5,c6=0,c7,c8,c9;
int bufdata[40]={};
int ipbuff[4]={0,0,0,0};
/*########################################################
################# 过滤数据整理 #########################
############ 所有数据转换成16进制数据 #################
########################################################*/
for(c=0;c
{
for(c1=0;c1<30;c1++)
{
if(argv[c][c1]=='