当前位置: 技术问答>linux和unix
我怎么才能读出截到的IP包的数据(用16进制)?
来源: 互联网 发布时间:2015-10-16
本文导语: 我用原始套界字抓到了IP层的包,然后分析TCP或UDP头,再移动指针到数据的位置,用16进制读出来,怎么读出来全是0呢?没读到? 我感觉是不是我指针的位置移错了????? 我对UDP携带的数据的位置有点不清楚,...
我用原始套界字抓到了IP层的包,然后分析TCP或UDP头,再移动指针到数据的位置,用16进制读出来,怎么读出来全是0呢?没读到?
我感觉是不是我指针的位置移错了?????
我对UDP携带的数据的位置有点不清楚,还有,我用 u_int16_t的指针可以读出来吗?
struct ip *pip;
struct iphdr *piph;
struct udphdr *pudp;
u_int16_t *data; //数据包数据指针
char buf[40960];
char *ptemp;
r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);
ptemp = buf;
if(ptype==ETHERTYPE_IP) //如果是IP数据包
{
printf("IP packet!");
ptemp += sizeof(struct ether_header); //指针后移eth头的长度
pip = (struct ip *)ptemp;
piph = (struct iphdr *)ptemp; //piph指向ip层的头
ptemp += sizeof(struct ip); //指针后移ip结构的长度
//处理UDP数据包
data=(u_char *)(pip + sizeof(struct iphdr) + 8);
if(piph->protocol==IPPROTO_UDP) //如果是UDP
{
pudp = (struct udphdr *)ptemp; //ptcp指向udp头部
for(i=0; i len)-8) ; ++i)
{
printf("%x ", data[i]);
if (i%20==19)
printf("n");
}
printf("n");
break;
}
}
我感觉是不是我指针的位置移错了?????
我对UDP携带的数据的位置有点不清楚,还有,我用 u_int16_t的指针可以读出来吗?
struct ip *pip;
struct iphdr *piph;
struct udphdr *pudp;
u_int16_t *data; //数据包数据指针
char buf[40960];
char *ptemp;
r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);
ptemp = buf;
if(ptype==ETHERTYPE_IP) //如果是IP数据包
{
printf("IP packet!");
ptemp += sizeof(struct ether_header); //指针后移eth头的长度
pip = (struct ip *)ptemp;
piph = (struct iphdr *)ptemp; //piph指向ip层的头
ptemp += sizeof(struct ip); //指针后移ip结构的长度
//处理UDP数据包
data=(u_char *)(pip + sizeof(struct iphdr) + 8);
if(piph->protocol==IPPROTO_UDP) //如果是UDP
{
pudp = (struct udphdr *)ptemp; //ptcp指向udp头部
for(i=0; i len)-8) ; ++i)
{
printf("%x ", data[i]);
if (i%20==19)
printf("n");
}
printf("n");
break;
}
}
|
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void print_info(struct iphdr *iph, uint16_t sport, uint16_t dport)
{
char sbuf[INET_ADDRSTRLEN];
char dbuf[INET_ADDRSTRLEN];
if (inet_ntop(AF_INET, &iph->saddr, sbuf, sizeof(sbuf)) &&
inet_ntop(AF_INET, &iph->daddr, dbuf, sizeof(dbuf)))
printf("%s:%u -> %s:%un", sbuf, sport, dbuf, dport);
}
static unsigned char buffer[1600];
int main(void)
{
int fd, len;
struct sockaddr_ll addr;
memset(&addr, 0, sizeof(addr));
addr.sll_family = AF_PACKET;
addr.sll_ifindex = 1;
if((fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void print_info(struct iphdr *iph, uint16_t sport, uint16_t dport)
{
char sbuf[INET_ADDRSTRLEN];
char dbuf[INET_ADDRSTRLEN];
if (inet_ntop(AF_INET, &iph->saddr, sbuf, sizeof(sbuf)) &&
inet_ntop(AF_INET, &iph->daddr, dbuf, sizeof(dbuf)))
printf("%s:%u -> %s:%un", sbuf, sport, dbuf, dport);
}
static unsigned char buffer[1600];
int main(void)
{
int fd, len;
struct sockaddr_ll addr;
memset(&addr, 0, sizeof(addr));
addr.sll_family = AF_PACKET;
addr.sll_ifindex = 1;
if((fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))