winpcap的QQ协议解析问题

fancybit 2017-03-01 08:39:02
自己定义了一个QQ包头
typedef struct _QQHeader {
BYTE Head;
WORD Version;
WORD Command;
WORD Sequence;
DWORD QQNumber;
} QQHeader, *PQQHeader;
然后从winpacp udp抓包范例改了一份
抓包回调函数是这样:
void packet_handler(u_char * param, const pcap_pkthdr * header, const u_char * pkt_data)
{
struct tm *ltime;
char timestr[16];
ip_header *ih;
udp_header *uh;
u_int ip_len;
u_short sport, dport;
time_t local_tv_sec;

/*
* unused parameter
*/
(VOID)(param);

/* convert the timestamp to readable format */
local_tv_sec = header->ts.tv_sec;
ltime = localtime(&local_tv_sec);
strftime(timestr, sizeof timestr, "%H:%M:%S", ltime);

/* print timestamp and length of the packet */
printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);

/* retireve the position of the ip header */
ih = (ip_header *)(pkt_data +
14); //length of ethernet header

/* retireve the position of the udp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header *)((u_char*)ih + ip_len);

/* convert from network byte order to host byte order */
sport = ntohs(uh->sport);
dport = ntohs(uh->dport);

/* print ip addresses and udp ports */
/*
printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n",
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
sport,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4,
dport);*/

auto qqHeader = (QQHeader*)((u_char*)uh + sizeof(u_short)*4);
if (qqHeader->Head != 0x02)return;
DWORD qqNumber = qqHeader->QQNumber;
auto newIP = new ip_address();
newIP->ul = ih->daddr.ul;
CQQSniffer::sQQIPTable[qqNumber] = shared_ptr<ip_address>(newIP);
}

能抓到包但是和wireshark的内容不一样 我这么计算qq包头位置是正确的么?
...全文
149 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-02
  • 打赏
  • 举报
回复
百度搜相关关键字。
fancybit 2017-03-01
  • 打赏
  • 举报
回复
有人熟悉 winpcap么
Wireshark(前称 Ethereal)是一个软件开发人员经常用到的网络封包分析软件。Wireshark 中文版网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。当然网站上也有其它的网络抓包工具也非常好用,比如 Fiddler 汉化版等等。 网络封包分析工具 Wireshark Portable 中文多语特别版 网络封包分析工具 Wireshark Portable 中文多语特别版 Wireshark 中文便携版使用 WinPCAP 作为接口,直接与网卡进行数据报文交换。网络封包分析软件的功能可想像成 “电工技师使用电表来量测电流、电压、电阻” 的工作 – 只是将场景移植到网络上,并将电线替换成网络线。 在过去,网络封包分析软件 Wireshark 非常昂贵,或是专门属于营利用的软件。Ethereal 的出现改变了这一切。在 GNUGPL 通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。 Wireshark 中文版是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样,Wireshark 也使用 pcap network library 来进行封包捕捉。可免费局域网内QQ、邮箱、msn、账号等的密码! Wireshark 中文版的原名是 Ethereal,新名字是 2006 年起用的。当时 Ethereal 的主要开发者决定离开他原来供职的公司,并继续开发这个软件。但由于 Ethereal 这个名称的使用权已经被原来那个公司注册,Wireshark 这个新名字也就应运而生了。 在成功运行 Wireshark 之后,我们就可以进入下一步,更进一步了解这个强大的工具。 Wireshark 使用目的 网络管理员使用 Wireshark 来检测网络问题,网络安全工程师使用 Wireshark 来检查资讯安全相关问题,开发者使用 Wireshark 来为新的通讯协定除错,普通使用者使用 Wireshark 来学习网络协定的相关知识。当然,有的人也会“居心叵测”的用它来寻找一些敏感信息…… Wireshark 不是入侵侦测系统(Intrusion Detection System,IDS)。对于网络上的异常流量行为,Wireshark 不会产生警示或是任何提示。然而,仔细分析 Wireshark 撷取的封包能够帮助使用者对于网络行为有更清楚的了解。Wireshark 不会对网络封包产生内容的修改,它只会反映出目前流通的封包资讯。 Wireshark本身也不会送出封包至网络上。 Wireshark 使用教程 1.确定 Wireshark 的位置 如果没有一个正确的位置,启动Wireshark后会花费很长的时间捕获一些与自己无关的数据。 2.选择捕获接口 一般都是选择连接到Internet网络的接口,这样才可以捕获到与网络相关的数据。否则,捕获到的其它数据对自己也没有任何帮助。 3.使用捕获过滤器 通过设置捕获过滤器,可以避免产生过大的捕获文件。这样用户在分析数据时,也不会受其它数据干扰。而且,还可以为用户节约大量的时间。 4.使用显示过滤器 通常使用捕获过滤器过滤后的数据,往往还是很复杂。为了使过滤的数据包再更细致,此时使用显示过滤器进行过滤。 5.使用着色规则 通常使用显示过滤器过滤后的数据,都是有用的数据包。如果想更加突出的显示某个会话,可以使用着色规则高亮显示。 6.构建图表 如果用户想要更明显的看出一个网络中数据的变化情况,使用图表的形式可以很方便的展现数据分布情况。 7.重组数据 Wireshark 的重组功能,可以重组一个会话中不同数据包的信息,或者是一个重组一个完整的图片或文件。由于传输的文件往往较大,所以信息分布在多个数据包中。为了能够查看到整个图片或文件,这时候就需要使用重组数据的方法来实现。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧