谁可以帮我看一下对抓包的数据导出分析数据!

做过网管或协议分析的人一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议、IP、UDP、TCP、甚至各种应用层协议),敏感数据的捕捉等。下面我们就来看看在windows下如何实现数据包的捕获。
WINSOCK本身就提供了抓取流经网卡的所有数据包的函数,虽然只能在IP协议层上捕捉,但只要您的工作没有涉及到数据链路层的话,这也就足够用了。抓取数据包的编程方法基本和编写其它网络应用程序一样,只需多一个步骤,即将SOCKET设置为接收所有数据的模式,这是用WSAIoctl来实现的。
编程实现主要有以下几个步骤:
1. 初始化WINSOCK库;
2. 创建SOCKET句柄;
3. 绑定SOCKET句柄到一个本地地址;
4. 设置该SOCKET为接收所有数据的模式;
5. 接收数据包;
6. 关闭SOCKET句柄,清理WINSOCK库;
除第4个步骤外,其它的步骤都和编写其它网络应用程序一样。那我们就主要来看一下第4个步骤WSAIoctl。
WSAIoctl是定义在mstcpip.h里面的。系统SDK里面本身就有。函数原型如下:int WSAIoctl(
LPWSAOVERLAPPED ,
LPWSAOVERLAPPED_COMPLETION_ROUTINE );
参数很多,但我们只需用到5个。s是步骤2创建的句柄;dwIoControlCode设为SIO_RCVALL;lpvInBuffer和cbInBuffer是输入参数,SIO_RCVALL的输入参数是u_long,给它一个1的值就可以了;lpcbBytesReturned是返回字节数,给一个DWORD变量的地址;其它的都没用,传0就可以了;u_long sioarg = 1;DWORD wt=0;WSAIoctl( h, SIO_RCVALL , &sioarg,sizeof(sioarg),NULL,0,&wt,NULL,NULL ) ;
下面我们就来看一下完整的代码:#include &winsock2.h>#include &windows.h>#include &Mstcpip.h>#pragma comment(lib,"Ws2_32.lib")#include &iostream>using namespace//IP首部typedef struct tIPPackHead{
enum PROTOCOL_TYPE{
PROTOCOL_TCP = 6,
PROTOCOL_UDP = 17,
PROTOCOL_ICMP = 1,
PROTOCOL_IGMP = 2
inline unsigned HeadLen() const
//首部长度单位为4bytes。因此乘4
return (ver_hlen & 0x0F) && 2;
inline unsigned PackLen() const
return wPacketL
//IP协议版本和IP首部长度。高4位为版本,低4位为首部的长度(单位为4bytes)
BYTE byTOS;
//服务类型
WORD wPacketL //IP包总长度。包括首部,单位为byte。[Big endian]
//序号,一般每个IP包的序号递增。[Big endian]
WORD wMarkFragP
BYTE byTTL;
//生存时间
BYTE byProtocolT //协议类型,见PROTOCOL_TYPE定义
WORD wHeadCheckS
//IP首部校验和[Big endian]
DWORD dwIPS
DWORD dwIPD
//目的地址} IP_PK_HEAD;int DecodeIP(char *buf, int len);int DecodeIP(char *buf, int len){
if( n >= sizeof(IP_PK_HEAD) )
IP_PK_HEAD
memcpy( &iphead, buf, sizeof(iphead) );
//以下三个为Big Endian字节顺序,转换成主机字节顺序
iphead.wPacketLen = ntohs( iphead.wPacketLen );
iphead.wSequence = ntohs( iphead.wSequence );
iphead.wHeadCheckSum = ntohs( iphead.wHeadCheckSum );
in_addr src,
src.S_un.S_addr = iphead.dwIPS
dst.S_un.S_addr = iphead.dwIPD
char strsrc[20],strdst[20];
strcpy(strsrc, inet_ntoa(src) );
strcpy( strdst , inet_ntoa(dst));
printf( "IP数据包: ver=%d,hlen=%d,protocol=%d,pklen=%d,seq=%d,src=%s,dst=%s _fcksavedurl="%s,dst=%s" ",
iphead.ver_hlen >> 4,
(iphead.ver_hlen & 0x0F) && 2,
iphead.byProtocolType,
iphead.wPacketLen,
iphead.wSequence,
return 0;}void AutoWSACleanup(){
::WSACleanup();}int _tmain(int argc, _TCHAR* argv[]){
//初始化winsock库,使用2.2版本
u_short wVersionRequested = 0x0202;
WSADATA wsaD
if( SOCKET_ERROR == WSAStartup( wVersionRequested, &wsaData ) )
cout && WSAGetLastError();
atexit( AutoWSACleanup );
//创建SOCKET
SOCKET h = socket( AF_INET, SOCK_RAW, IPPROTO_IP);
if( h == INVALID_SOCKET )
cout && WSAGetLastError();
//获取本机地址
char FAR name[128];
if( -1 == gethostname(name, sizeof(name)) )
closesocket( h );
cout && WSAGetLastError();
struct hostent FAR * pH
pHostent = gethostbyname(name);
//绑定本地地址到SOCKET句柄
addr.sin_family = AF_INET;
addr.sin_addr = *(in_addr*)pHostent->h_ //IP
addr.sin_port = 0; //端口,IP层端口可随意填
if( SOCKET_ERROR == bind( h,(sockaddr *)&addr,sizeof(addr) ) )
closesocket( h );
cout && WSAGetLastError();
//设置该SOCKET为接收所有流经绑定的IP的网卡的所有数据,包括接收和发送的数据包
//该函数在mstcpip.h里面,详见MSDN帮助
u_long sioarg = 1;
DWORD wt=0;
if( SOCKET_ERROR == WSAIoctl( h, SIO_RCVALL , &sioarg,sizeof(sioarg),NULL,0,&wt,NULL,NULL ) )
closesocket( h );
cout && WSAGetLastError();
//我们只需要接收数据,因此设置为阻塞IO,使用最简单的IO模型
u_long bioarg =
if( SOCKET_ERROR == ioctlsocket( h, FIONBIO , &bioarg ) )
closesocket( h );
cout && WSAGetLastError();
//开始接收数据
//因为前面已经设置为阻塞IO,recv在接收到数据前不会返回。
//当返回&=0时表示接收失败,退出循环
//可以在另一个线程执行此循环,主线程closesocket可以使recv失败而结束循环
char buf[102400];
int len = 0;
len = recv( h, buf, sizeof(buf),0);
if( len > 0 )
DecodeIP( buf, len );
}while( len > 0 );
closesocket( h );
return 0;}
绑定地址时,必须获取到本机的一个真实IP地址,不能用0.0.0.0或127.0.0.0.1。端口就没有限制了。接收数据的方法和基于TCP或UDP的接收是一样的。也可以用非阻塞IO,并采用select、WSAAsyncSelect、WSAEventSelect等IO模型来处理。但我们要做的只是简单地接收数据而已,不需要任何交互,实在没有必要给自己找麻烦。这里我用的是阻塞IO,即在接收到数据前recv不会返回,一旦返回了,要不就是接收到数据,要不就是接收失败。当接收失败时循环就退出了。不过因为是阻塞IO的关系,主线程就无法进行其它操作,最好把接收数据的循环放到第二线程内。主线程通过closesocket就可以使接收失败从而结束接收数据的循环了。
通过这种方法接收到的数据是个IP层的数据包,每个数据包的开始是至少20个字节的IP首部,IP首部定义见tIPPackHead结构体,关于IP首部的更详细的资料可以参考《TCP-IP详解卷1:协议》第3章,在此就不多作描述。DecodeIP是对IP首部的解析,IP首部后面的数据则需要根据首部里面的协议类型进行各自不同处理。如果是TCP协议则按照TCP协议解析,UDP则按UDP协议解析。下面附上TCP和UDP首部的定义,更详细的信息请参考《TCP-IP详解卷1:协议》第11和17章。//UDP首部typedef struct tUDPPackHead{
inline unsigned HeadLen() const
inline unsigned PackLen() const
/*Source Port*/
/*Destinate Port*/
/*UDP Length*/
WORD wCheckS
/*UDP CheckSum*/} UDP_PK_HEAD;//TCP首部typedef struct tTCPPackHead
inline unsigned HeadLen() const
return ((lenres>>4) & 0x0F) && 2;
WORD wSrcP //16位源端口
WORD wDstP //16位目的端口
DWORD dwS //32位序列号
DWORD dwA //32位确认号
unsigned char //4位首部长度/6位保留字 (高4bit为head len)
unsigned char //6位标志位 (低6bit为标志)
WORD wW //16位窗口大小
WORD wS //16位校验和
WORD wU //16位紧急数据偏移量 }TCP_PK_HEAD;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2414110次
积分:32448
积分:32448
排名:第51名
原创:899篇
转载:447篇
评论:583条
阅读:33792抓包到一段QQ应用游戏的登录时的数据,是GET类的,求帮分析。|易语言俱乐部 - 易语言汉语编程官方论坛 - Powered by phpwind
查看完整版本: [--
抓包到一段QQ应用游戏的登录时的数据,是GET类的,求帮分析。
http&&&&&&:&& /&& /&&s116./co/qq/login?seqid=&openid=XXXXXXXX&openkey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX&platform=qqgame&pf=qqgame&serverid=116&pfkey=XXXXXXXXXXXXXXXXXXX&s=0.511&这个是一个QQ应用游戏的登录相关的GET数据openidopenkeypfkey这三个是根据不同的QQ帐号来的。现在我不清楚那个seqid有没有用? 还有最后的那个 s=0.511 不知有什么作用。如果我简化成http&& :&& /&& /&& s116./co/qq/login?openid=XXXXXXXX&openkey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX&platform=qqgame(去掉了seqid ,去掉了pfkey 去掉了s=0.511)一样可以登录。这样我就迷惑了,不知简化前和简化后有区别不?
有人知道不?
你可以多抓几次包,比较一下serverid、pfkey、s后面的值,看一下有啥规律没。
seqid 好像是从游戏服务器返回的一个数据 是登录他们服务器必须的
seqid 官方有说明 想一起研究的 短信我
有一起交流的没 加个QQ
seqid 官方有说明
你可以多抓几次包,比较一下serverid
查看完整版本: [--
Powered by
Gzip enabled您当前所在位置:
Iptool抓包工具通讯协议分析使用方法技巧
Iptool抓包工具通讯协议分析使用方法技巧
在使用Iptool抓包工具过程中,想要对Internet通讯部分进行分享,我们需要了解下面的操作方法。有需要的朋友们可以看一下。
相关软件下载:IpTool(网络抓包工具)
软件名称:IpTool(网络抓包工具)
下载地址:
软件版本:V1.2
软件类别:浏览辅助
IpTool网络抓包工具能够准确的捕包分析功能部分。
在使用Iptool抓包工具过程中,想要对Internet通讯部分进行分享,我们需要了解下面的操作方法。有需要的朋友们可以看一下。
Iptool抓包工具通讯协议分析使用方法技巧
捕包分析工具条:
开始捕包前,用户需先进行过滤设置,选项内容包括:
如果您有多块网卡,需要选中能捕包到预想中的数据的网卡。
针对Internet通讯部分,常见的IP包类型为:TCP/UDP/ICMP。绝大部分是TCP连接的,比如HTTP(s)/SMTP/POP3/FTP/TELNET等等;一部分聊天软件中除了采用TCP通讯方式外,也采用了UDP的传输方式,如QQ/SKYPE等;而常见的ICMP包是由客户的Ping产生的。设置界面如下:
&IP过滤&在捕包过滤使用最为常见,IP匹配主要分两类:一是不带通讯方向,单纯的是范围的匹配,如上图中的&From:to&类型;另外一类是带通讯方向的一对一匹配,如上图&& -- &&类型,不仅匹配IP地址,也匹配通讯的源IP和目标IP的方向。
&端口过滤&只针对两种类型的DoD-IP包:TCP/UDP。
数据区大小
&数据区大小& 的匹配针对所有DoD-IP类型包,不过需要说明的是,TCP/UDP的IP数据区是以实际数据区位置开始计算的,而其他类型的则把紧随IP包头后面的部分当作数据区。
关键词标签:
延伸相关阅读:
软件教程推荐
第九专题推荐
每周酷软推荐
小巧方便的极速浏览器
彩蝶浏览器是一款便捷、小巧的上网浏览工具,占用内存小,一键触达...
第九软件教程推荐数据包抓包分析_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
53页免费53页免费64页免费4页免费81页1下载券3页免费47页1下载券24页1下载券14页3下载券5页免费
喜欢此文档的还喜欢5页免费87页1下载券21页2下载券25页2下载券7页2下载券
数据包抓包分析|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢有没有人对AMF传输协议格式清晰的,帮我分析一段数据。
[问题点数:70分,无满意结帖,结帖人lijinfenghust]
有没有人对AMF传输协议格式清晰的,帮我分析一段数据。
[问题点数:70分,无满意结帖,结帖人lijinfenghust]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2009年6月 C/C++大版内专家分月排行榜第三
2009年4月 总版技术专家分月排行榜第一
2009年11月 Linux/Unix社区大版内专家分月排行榜第一2009年6月 Linux/Unix社区大版内专家分月排行榜第一2009年4月 C/C++大版内专家分月排行榜第一2009年3月 C/C++大版内专家分月排行榜第一2009年3月 Linux/Unix社区大版内专家分月排行榜第一2009年2月 Linux/Unix社区大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 数据抓包 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信