YY的音频数据传输是P2P协议,音频的编码为AAC,下面抓去的音频编码的信息和频谱信息。
音频编码为AAC,采样为44K,码率24kb/s。音频编码在24kb/s码率能达到15K的音质。值得大家学习啊。
1.准备工具
procexp.exe 分析YY的进程信息
Procmon.exe 分析YY的网络数据包
wireshark.exe 分析网络包的内容
2.分析YY的进程信息
使用procexp分析YY的大致信息,比如进程号,网络连接等
3.分析YY的网络传输信息
使用procmon分析YY的网络数据,根据上面的得到的进程ID设置过滤,只接受YY的UDP数据包
过滤后得到数据包如下:
从上面的数据可以看到端口为8456的UDP接受数据最多,可以看出这个端口接受的就是P2P音频数据。
4.使用wireshark抓取P2P音频数据包
设置wireshark的过滤器,只抓去端口为8456的UDP数据包
抓去的数据如下:
查看UDP数据流,这里面存的就是YY的音频数据。从下面的数据看不出来具体的音频编码。
不急,我们多看几个数据包就会发现,他们都有固定的数据头,紧接着都刚好是0xff|0xf1(这个刚好是aac ADTS的同步头)。所以我们可以按照这个思路分析下去。
5. 使用代码分析pcap抓去的数据包
详细分析参考代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <WinSock2.h>
- #include <assert.h>
-
-
- typedef unsigned int bpf_u_int32;
- typedef unsigned char u_char;
- typedef unsigned short u_short;
- typedef unsigned int u_int;
- typedef int bpf_int32;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- typedef struct pcap_file_header {
- bpf_u_int32 magic;
- u_short version_major;
- u_short version_minor;
- bpf_int32 thiszone;
- bpf_u_int32 sigfigs;
- bpf_u_int32 snaplen;
- bpf_u_int32 linktype;
- }pcap_file_header;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- typedef struct timestamp{
- bpf_u_int32 timestamp_s;
- bpf_u_int32 timestamp_ms;
- }timestamp;
-
- typedef struct pcap_header{
- timestamp ts;
- bpf_u_int32 capture_len;
- bpf_u_int32 len;
-
- }pcap_header;
-
-
- void printPcapHeader(pcap_file_header * ph)
- {
- printf("=====================\n"
- "magic:0x%0x\n"
- "version_major:%u\n"
- "version_minor:%u\n"
- "thiszone:%d\n"
- "sigfigs:%u\n"
- "snaplen:%u\n"
- "linktype:%u\n"
- "=====================\n",
- ph->magic,
- ph->version_major,
- ph->version_minor,
- ph->thiszone,
- ph->sigfigs,
- ph->snaplen,
- ph->linktype);
- }
-
- void printPacketHeader(pcap_header * ph)
- {
- printf("=====================\n"
- "ts.timestamp_s:%u\n"
- "ts.timestamp_ms:%u\n"
- "capture_len:%u\n"
- "len:%d\n"
- "=====================\n",
- ph->ts.timestamp_s,
- ph->ts.timestamp_ms,
- ph->capture_len,
- ph->len);
- }
-
-
-
-
-
- typedef struct ip_address{
- u_char byte1;
- u_char byte2;
- u_char byte3;
- u_char byte4;
- }ip_address;
-
-
- typedef struct ip_header{
- u_char ver_ihl;
- u_char tos;
- u_short tlen;
- u_short identification;
- u_short flags_fo;
- u_char ttl;
- u_char proto;
- u_short crc;
- ip_address saddr;
- ip_address daddr;
- u_int op_pad;
- }ip_header;
-
-
- typedef struct udp_header{
- u_short sport;
- u_short dport;
- u_short len;
- u_short crc;
- }udp_header;
-
- u_char pkt_data[65536];
-
- int main()
- {
- FILE * fp = fopen("yy.p2p.packet_long.pcap", "rb");
- if (!fp)
- {
- fprintf(stderr, "open file error\n");
- return -1;
- }
- FILE * aacfp = fopen("yy.p2p.packet_long.pcap.aac", "wb");
- if (!fp)
- {
- fprintf(stderr, "open file error\n");
- return -1;
- }
-
-
- pcap_file_header pfh;
- fread(&pfh, 1, sizeof(pfh), fp);
- printPcapHeader(&pfh);
-
-
-
- while (!feof(fp))
- {
- pcap_header ph;
- if (fread(&ph, 1, sizeof(ph), fp) != sizeof(ph))
- break;
- printPacketHeader(&ph);
-
- if (fread(pkt_data, 1, ph.capture_len, fp) != ph.capture_len)
- break;
-
-
-
-
- ip_header *ih = (ip_header *)(pkt_data + 14);
-
-
- if (ih->proto != 0x11)
- continue;
-
-
- u_int ip_len = (ih->ver_ihl & 0x0f) * 4;
- udp_header * uh = (udp_header *)((u_char *)ih + ip_len);
-
-
- u_short sport = ntohs(uh->sport);
- u_short dport = ntohs(uh->dport);
- u_short udplen = ntohs(uh->len);
-
- if(sport != 8455)
- continue;
-
- 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);
-
-
- u_char * udp_data = (u_char *)uh + 8;
-
-
-
- u_char * aac_data = pkt_data + 14 + ip_len + 8 + 34;
- int aac_len = ph.capture_len - (14 + ip_len + 8 + 34);
-
- if (aac_len <= 0) continue;
- assert(aac_len < ph.capture_len);
-
- printf("aac len = %d pkt_len = %d\n", aac_len, ph.capture_len);
- assert(aac_data[0] == 0xff && aac_data[1] == 0xf1);
-
- fwrite(aac_data, 1, aac_len, aacfp);
-
- }
-
- fclose(fp);
- fclose(aacfp);
- return 0;
- }
抓包分析YY音频,布布扣,bubuko.com
抓包分析YY音频
原文:http://www.cnblogs.com/fuland/p/3787825.html