我正在做分析数据包的项目,
现在可以得到数据包的各个包头的数据
也就是把包都打开了
问题是得到的二进制数据怎么还原?
怎么变成发送时的字符或者附件
多谢!
现在可以得到数据包的各个包头的数据
也就是把包都打开了
问题是得到的二进制数据怎么还原?
怎么变成发送时的字符或者附件
多谢!
解决方案 »
- 【求助】图像处理(霍夫变换)新问题,谢谢大家。
- 工具栏资源只支持bmp的,要是加载一张png//不知如何是好
- 怎样让图片显示在程序的最上面!显示在所有控件上面
- Unicode编码如何显示?
- 我想往excel中写东西,可是在调用GetWorkbooks总是说没有这个方法,怎么办?帮忙把小弟的程序写完好吗?我用的是excel2003
- 如何能先使整个屏幕变黑(即黑色背景)?
- 请问有没有支持实时数据显示和打印的免费控件?可以高分再加!!!
- 一个关于CButtonST的问题
- VC中启动打印机打印一个txtx文件,除了用ShellExecute,还有别的函数实现吗?
- 谁帮我改改这段代码啊,问题解决立即给分,关于UNNICODE下字符串的
- 【卖书】 0.5元 一本的电子书 (up 有分)
- 为什么显示为乱码?
//IP解包程序
int DecodeIpPack(char *buf, int iBufSize)
{
IP_HEADER *pIpheader;
SOCKADDR_IN saSource, saDest;
pIpheader = (IP_HEADER *)buf;
//协议甄别
iProtocol = pIpheader->proto;
strncpy(szProtocol, CheckProtocol(iProtocol), MAX_PROTO_TEXT_LEN);
if((iProtocol==IPPROTO_TCP) && (!ParamTcp)) return true;
if((iProtocol==IPPROTO_UDP) && (!ParamUdp)) return true;
if((iProtocol==IPPROTO_ICMP) && (!ParamIcmp)) return true;
//源地址
saSource.sin_addr.s_addr = pIpheader->sourceIP;
strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
if (strFromIpFilter)
if (strcmp(strFromIpFilter,szSourceIP)) return true;
//目的地址
saDest.sin_addr.s_addr = pIpheader->destIP;
strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
if (strDestIpFilter)
if (strcmp(strDestIpFilter,szDestIP)) return true;
iTTL = pIpheader->ttl;
//计算IP首部的长度
int iIphLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf);
//根据协议类型分别调用相应的函数
switch(iProtocol)
{
case IPPROTO_TCP :DecodeTcpPack(buf+iIphLen, iBufSize);break;
case IPPROTO_UDP :DecodeUdpPack(buf+iIphLen, iBufSize);break;
case IPPROTO_ICMP :DecodeIcmpPack(buf+iIphLen, iBufSize);break;
default :break;
}
//printf("\n");
return true;
}//协议识别程序
char * CheckProtocol(int iProtocol)
{
for(int i=0; i<MAX_PROTO_NUM; i++)
if(ProtoMap[i].ProtoNum==iProtocol)
return ProtoMap[i].ProtoText;
return "";
}//TCP解包程序
int DecodeTcpPack(char * TcpBuf, int iBufSize)
{
TCP_HEADER * pTcpHeader;
int i;
int iSourcePort,iDestPort;
pTcpHeader = (TCP_HEADER * )TcpBuf;
//计算TCP首部长度
int TcpHeaderLen = pTcpHeader->th_lenres>>4;
TcpHeaderLen *= sizeof(unsigned long);
char * TcpData=TcpBuf+TcpHeaderLen;
//如果过滤敏感字符串则判断是否包含
if (strSensitive)
if ((strstr(TcpData, strSensitive))==NULL) return true;
//对端口进行过滤
iSourcePort = ntohs(pTcpHeader->th_sport);
iDestPort = ntohs(pTcpHeader->th_dport);
if ((iPortFilter) && (iSourcePort!=iPortFilter) && (iDestPort!=iPortFilter))
return true;
//输出
printf("%s ", szProtocol);
printf("%15s:%5d ->%15s:%5d ", szSourceIP, iSourcePort, szDestIP, iDestPort);
printf("TTL=%3d ", iTTL);
//判断TCP标志位
unsigned char FlagMask = 1;
for( i=0; i<6; i++ )
{
if((pTcpHeader->th_flag) & FlagMask) printf("%c",TcpFlag[i]);
else printf("-");
FlagMask=FlagMask<<1;
}
printf(" bytes=%4d", iBufSize);
printf("\n");
//对于长度大于40字节的包进行数据分析(IP_HEADER+TCP_HEADER=40)
if ((ParamDecode) && (iBufSize>40))
{
//分析TCP数据段
if ((!strSensitive) || (strstr(TcpData,strSensitive)))
{
printf(" [DATA]\n");
printf("%s",TcpData);
printf("\n [DATA END]\n\n\n");
}
}
return true;
}
//UDP解包程序
int DecodeUdpPack(char * UdpBuf, int iBufSize)
{
UDP_HEADER *pUdpHeader;
pUdpHeader = (UDP_HEADER * )UdpBuf;
int iSourcePort = ntohs(pUdpHeader->uh_sport);
int iDestPort = ntohs(pUdpHeader->uh_dport);
//对端口进行过滤
if(iPortFilter)
if ((iSourcePort!=iPortFilter) && (iDestPort!=iPortFilter))
return true;
printf("%s ", szProtocol);
printf("%15s:%5d ->%15s:%5d ", szSourceIP, iSourcePort, szDestIP, iDestPort);
printf("TTL=%3d ", iTTL);
printf("Len=%4d ", ntohs(pUdpHeader->uh_len));
printf("bytes=%4d", iBufSize);
printf("\n");
//对于长度大于28字节的包进行数据分析(IP_HEADER+UDP_HEADER>28)
if ((ParamDecode) && (iBufSize>28))
{
printf(" [DATA]\n");
//UDP首部长度为8
char * UdpData=UdpBuf+8;
//分析UDP数据段
for(unsigned int i=0;i<(iBufSize-sizeof(UDP_HEADER));i++)
{
if (!(i%8)) printf("\n");
if ( (UdpData[i]>33) && (UdpData[i]<122) )
printf("%3c [%3x]", UdpData[i], UdpData[i]);
else printf(" [%3x]", abs(UdpData[i]));
}
printf("\n [DATA END]\n\n\n");
}
return true;
}//ICMP解包程序
int DecodeIcmpPack(char * IcmpBuf, int iBufSize)
{
ICMP_HEADER * pIcmpHeader;
pIcmpHeader = (ICMP_HEADER * )IcmpBuf;
int iIcmpType = pIcmpHeader->i_type;
int iIcmpCode = pIcmpHeader->i_code;
//对类型进行过滤
if ((iPortFilter) && (iIcmpType!=iPortFilter)) return true;
printf("%s ", szProtocol);
//printf("%15s Type%d ->%15s Code%d ", szSourceIP, iIcmpType, szDestIP, iIcmpCode);
printf("%15s ->%15s ", szSourceIP, szDestIP);
printf("TTL=%3d ", iTTL);
printf("Type%2d,%d ",iIcmpType,iIcmpCode);
printf("bytes=%4d", iBufSize);
printf("\n");
//对于包含数据段的包进行数据分析
if ((ParamDecode) && (iBufSize>28))
{
char * IcmpData=IcmpBuf+4;
//分析ICMP数据段
printf(" [DATA]");
for(unsigned int i=0;i<(iBufSize-sizeof(ICMP_HEADER));i++)
{
if (!(i%8)) printf("\n");
if ( (IcmpData[i]>33) && (IcmpData[i]<122) )
printf("%3c [%3x]", IcmpData[i], IcmpData[i]);
else printf(" [%3x]", abs(IcmpData[i]));
}
printf("\n [DATA END]\n\n\n");
}
return true;
}
struct MyStruct
{
...
}
你截到的包的数据放在 byte Pack[]里,
可以用
memcpy(&MyStruct, Pack , Length); //length是包长
我的意思说已经把IP头,TCP头都解包了.
只是不明白得到的数据如何还原
比如:
他发了一个QQ数据包,
里面含有一个附件,
我可以把这个数据包的以太头,IP头,TCP头分析出来
但是不知道如何还原这个附件
怎样分析这个附件(或者文字)的二进制?
一般分析:
包头分析->TCP排队->应用层协议解析
对于邮件,去除pop3或smtp协议内容后,tcp流就是eml文件格式,可用oe打开。
那么对于普通的Web邮件应该如何解码
得到邮件的文字内容和附件??
察看邮件和察看普通页面相同,
发送邮件和聊天发言相同,
都是网站相关的,post一段文字,只有网站知道它是不是邮件。
我试试。
To ndy_w(carpe diem)
你的意思是不是 :不能从数据包中分析得出附件的内容?
也希望学习一下如何获取数据包,我看了TCP-IP详解的实现部分,感觉很空,在Windows上还找不到切入点。
我用的是winpcap开发包,
但我想实现的是 分析数据包的数据部分,而不是包头
只要不加密
基本上是可以解析出来的
比如163,yahoo收发信件都可解析
有的网站邮件服务器做得不好
甚至连用户名密码都可以得到
那么你还原过附件吗?
如何能把附件解析出来?
//============
如果有附件还有考虑很多因素的,如是否加密,UNICODE编码等,所以要解析附件
难度很大
发送附件有的是在一个form里提交(如sina),有的是单独提交(多数)。接收附件跟下载文件一样。
附件跟邮件的联系一般在cookie中。