抓包分析YY音频

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抓去的数据包

详细分析参考代码:

[cpp] view plaincopyprint?

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <WinSock2.h>
    4. #include <assert.h>
    5. ///
    6. typedef unsigned int  bpf_u_int32;
    7. typedef unsigned char u_char;
    8. typedef unsigned short  u_short;
    9. typedef unsigned int u_int;
    10. typedef int bpf_int32;
    11. /*
    12. Pcap文件分析如下:
    13. +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
    14. |Pcap Header    |Packet Header  |Packet Body    |Packet Header  |Packet Body    |
    15. +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
    16. */
    17. /*
    18. Pcap文件头
    19. +-------+-------+-------+-------+
    20. |       Magic 4B                |
    21. +-------+-------+-------+-------+
    22. |   Major 2B    |  Minor 2B     |
    23. +-------+-------+-------+-------+
    24. |       ThisZone 4B             |
    25. +-------+-------+-------+-------+
    26. |       SigFigs 4B              |
    27. +-------+-------+-------+-------+
    28. |       SnapLen 4B              |
    29. +-------+-------+-------+-------+
    30. |       LinkType 4B             |
    31. +-------+-------+-------+-------+
    32. Pcap文件头24B各字段说明:
    33. Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始
    34. Major:2B,0x02 00:当前文件主要的版本号
    35. Minor:2B,0x04 00当前文件次要的版本号
    36. ThisZone:4B当地的标准时间;全零
    37. SigFigs:4B时间戳的精度;全零
    38. SnapLen:4B最大的存储长度
    39. LinkType:4B链路类型
    40. 常用类型:
    41. 0            BSD loopback devices, except for later OpenBSD
    42. 1            Ethernet, and Linux loopback devices
    43. 6            802.5 Token Ring
    44. 7            ARCnet
    45. 8            SLIP
    46. 9            PPP
    47. */
    48. typedef struct pcap_file_header {
    49. bpf_u_int32 magic;
    50. u_short version_major;
    51. u_short version_minor;
    52. bpf_int32 thiszone;
    53. bpf_u_int32 sigfigs;
    54. bpf_u_int32 snaplen;
    55. bpf_u_int32 linktype;
    56. }pcap_file_header;
    57. /*
    58. Packet 包头和Packet数据组成
    59. +-------+-------+
    60. |Packet Header  |
    61. +-------+-------+
    62. |Packet Body    |
    63. +-------+-------+
    64. Paket 包头
    65. +-------+-------+-------+-------+
    66. |       Timestamp 4B            |
    67. +-------+-------+-------+-------+
    68. |       Timestamp 4B            |
    69. +-------+-------+-------+-------+
    70. |       Caplen 4B               |
    71. +-------+-------+-------+-------+
    72. |       Len 4B                  |
    73. +-------+-------+-------+-------+
    74. 字段说明:
    75. Timestamp:时间戳高位,精确到seconds
    76. Timestamp:时间戳低位,精确到microseconds
    77. Caplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
    78. Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。
    79. Packet 数据:即 Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就 是说:PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet包确定。
    80. */
    81. typedef struct  timestamp{
    82. bpf_u_int32 timestamp_s;
    83. bpf_u_int32 timestamp_ms;
    84. }timestamp;
    85. typedef struct pcap_header{
    86. timestamp ts;
    87. bpf_u_int32 capture_len;
    88. bpf_u_int32 len;
    89. }pcap_header;
    90. //help funtion
    91. void  printPcapHeader(pcap_file_header * ph)
    92. {
    93. printf("=====================\n"
    94. "magic:0x%0x\n"
    95. "version_major:%u\n"
    96. "version_minor:%u\n"
    97. "thiszone:%d\n"
    98. "sigfigs:%u\n"
    99. "snaplen:%u\n"
    100. "linktype:%u\n"
    101. "=====================\n",
    102. ph->magic,
    103. ph->version_major,
    104. ph->version_minor,
    105. ph->thiszone,
    106. ph->sigfigs,
    107. ph->snaplen,
    108. ph->linktype);
    109. }
    110. void printPacketHeader(pcap_header * ph)
    111. {
    112. printf("=====================\n"
    113. "ts.timestamp_s:%u\n"
    114. "ts.timestamp_ms:%u\n"
    115. "capture_len:%u\n"
    116. "len:%d\n"
    117. "=====================\n",
    118. ph->ts.timestamp_s,
    119. ph->ts.timestamp_ms,
    120. ph->capture_len,
    121. ph->len);
    122. }
    123. //////////////////////////////////////////////////////////////////////////
    124. /*
    125. UDP包分析
    126. */
    127. /* 4字节的IP地址 */
    128. typedef struct ip_address{
    129. u_char byte1;
    130. u_char byte2;
    131. u_char byte3;
    132. u_char byte4;
    133. }ip_address;
    134. /* IPv4头 */
    135. typedef struct ip_header{
    136. u_char  ver_ihl;        // 版本 (4 bits) + 首部长度 (4 bits)  /// 首部长度
    137. u_char  tos;            // 服务类型(Type of service)
    138. u_short tlen;           // 总长(Total length)
    139. u_short identification; // 标识(Identification)
    140. u_short flags_fo;       // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
    141. u_char  ttl;            // 存活时间(Time to live)
    142. u_char  proto;          // 协议(Protocol)
    143. u_short crc;            // 首部校验和(Header checksum)
    144. ip_address  saddr;      // 源地址(Source address)
    145. ip_address  daddr;      // 目的地址(Destination address)
    146. u_int   op_pad;         // 选项与填充(Option + Padding)
    147. }ip_header;
    148. /* UDP头 */
    149. typedef struct udp_header{
    150. u_short sport;          // 源端口(Source port)
    151. u_short dport;          // 目的端口(Destination port)
    152. u_short len;            // UDP数据包长度(Datagram length)   /// UDP总长度
    153. u_short crc;            // 校验和(Checksum)
    154. }udp_header;
    155. u_char pkt_data[65536];
    156. int main()
    157. {
    158. FILE * fp = fopen("yy.p2p.packet_long.pcap", "rb");
    159. if (!fp)
    160. {
    161. fprintf(stderr, "open file error\n");
    162. return -1;
    163. }
    164. FILE * aacfp = fopen("yy.p2p.packet_long.pcap.aac", "wb");
    165. if (!fp)
    166. {
    167. fprintf(stderr, "open file error\n");
    168. return -1;
    169. }
    170. //1. Read pcap file header
    171. pcap_file_header pfh;
    172. fread(&pfh, 1, sizeof(pfh), fp);
    173. printPcapHeader(&pfh);
    174. //2. Read pcap packet
    175. while (!feof(fp))
    176. {
    177. pcap_header ph;
    178. if (fread(&ph, 1, sizeof(ph), fp) != sizeof(ph))
    179. break;
    180. printPacketHeader(&ph);
    181. if (fread(pkt_data, 1, ph.capture_len, fp) != ph.capture_len)
    182. break;
    183. //3. 分析消息包内容
    184. //fseek(fp, ph.capture_len, 1);
    185. // 获取IP数据包头的位置
    186. ip_header *ih = (ip_header *)(pkt_data + 14); // 14以太网头部长度
    187. // 只处理UDP包
    188. if (ih->proto != 0x11)
    189. continue;
    190. // 获取UDP首部的位置
    191. u_int ip_len = (ih->ver_ihl & 0x0f) * 4;
    192. udp_header * uh = (udp_header *)((u_char *)ih + ip_len);
    193. //
    194. u_short sport = ntohs(uh->sport);
    195. u_short dport = ntohs(uh->dport);
    196. u_short udplen = ntohs(uh->len);
    197. if(sport != 8455) // yy源端口为8455
    198. continue;
    199. /* 打印IP地址和UDP端口 */
    200. printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n",
    201. ih->saddr.byte1,
    202. ih->saddr.byte2,
    203. ih->saddr.byte3,
    204. ih->saddr.byte4,
    205. sport,
    206. ih->daddr.byte1,
    207. ih->daddr.byte2,
    208. ih->daddr.byte3,
    209. ih->daddr.byte4,
    210. dport);
    211. //
    212. u_char * udp_data = (u_char *)uh + 8;
    213. //u_char * aac_data = udp_data + 34;
    214. //u_short  aac_len = udplen - 8 - 34;
    215. u_char * aac_data = pkt_data + 14 + ip_len + 8 + 34;
    216. int  aac_len = ph.capture_len - (14 + ip_len + 8 + 34);
    217. //assert(aac_len > 0);
    218. if (aac_len <= 0) continue;   /// 只有 yy头,没有aac数据
    219. assert(aac_len < ph.capture_len);
    220. printf("aac len = %d pkt_len = %d\n", aac_len, ph.capture_len);
    221. assert(aac_data[0] == 0xff && aac_data[1] == 0xf1);
    222. fwrite(aac_data, 1, aac_len, aacfp);
    223. }
    224. fclose(fp);
    225. fclose(aacfp);
    226. return 0;
    227. }

抓包分析YY音频

时间: 2024-10-11 01:53:49

抓包分析YY音频的相关文章

通信导论-网络协议抓包分析

一. 网络 网络规划表 源IP地址 默认网关 目的IP地址 域名 备注 192.168.43.16 192.168.43.1 104.74.21.164 360.com 360浏览器网页地址 192.168.43.16 192.168.43.1 182.232.136.130 yy.com 直播YY平台网页地址 2.配置 步骤:控制面板—网络和Internet—网络和共享中心—连接—属性—Internet协议版本4(TCP/IPv4)—属性—手动输入IP地址和DNS服务器地址 3.连通性测试 I

第二组通信三班205孙斯美抓包分析

抓包分析 1. 网络规划表图如下 源ip地址 目的IP地址 域名 备注 192.168.43.1 183.232.175.239 www.haoqq.com QQ浏览器 192.168.43.1 192.168.43.205 www.yy.com Yy直播 2. 打开“控制面板”→选择“网络和Internet”→选择“网络和共享中心”→选择已连接的WLAN→选择“属性”→打开“Internet协议版本4(TCP/IPv4)的属性”.更改IP地址如下: 3. 连通性:打开网页,能上网. 二.应用层

tcpdump抓包分析具体解释

說實在的,對於 tcpdump 這個軟體來說,你甚至能够說這個軟體其實就是個駭客軟體, 因為他不但能够分析封包的流向,連封包的內容也能够進行『監聽』, 假设你使用的傳輸資料是明碼的話,不得了,在 router 上面就可能被人家監聽走了! 非常可怕吶!所以,我們也要來瞭解一下這個軟體啊!(註:這個 tcpdump 必須使用 root 的身份執行) [[email protected] ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae] [-qX] [

云计算之路-阿里云上:Wireshark抓包分析一个耗时20秒的请求

这篇博文分享的是我们针对一个耗时20秒的请求,用Wireshark进行抓包分析的过程. 请求的流程是这样的:客户端浏览器 -> SLB(负载均衡) -> ECS(云服务器) -> SLB -> 客户端浏览器. 下面是分析的过程: 1. 启动Wireshark,针对内网网卡进行抓包. 2. 在IIS日志中找出要分析的请求(借助Log Parser Studio) 通过c-ip(Client IP Address)可以获知SLB的内网IP,在分析Wireshar抓包时需要依据这个IP进

Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续二)

一.URL分析 通过对“Python机器学习”结果抓包分析,有两个无规律的参数:_ksTS和callback.通过构建如下URL可以获得目标关键词的检索结果,如下所示: https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksTS=1482325509866_2527&callback=jsonp2528&q=Python机器学习&imgfile=&js=1&stat

使用Fiddler对手机进行抓包分析

场景:一个html页面,安卓app使用webview来显示,但是显示效果不是预期的.于是自己写了一个基本webview的demo,使用webview的loadurl方法请求这个html页面.可以正确显示,但是客户端组抓包说我请求的地址不一样,让我自己抓包分析. 分析:app在请求这个页面时请求附加了字符串及cookie等信息. 解决方法:使用Fiddler抓包,抓包过程网上有很多教程,注意一点有的手机可能设置代理时不能设置全局代理,可以使用ProxyDroid来设置全局代理. Fiddler抓包

云计算之路-阿里云上:超过70秒的请求抓包分析

超过70秒的请求是通过分析IIS日志发现的: 10.159.63.104是SLB的内网IP. 通过Wireshark抓包分析请求是9:22:21收到的(tcp.stream eq 23080): 09:22:21.299838000 10.159.63.104 10.161.241.208 HTTP 291 GET /eastsea/p/3764040.html HTTP/1.0 这个请求响应内容的长度是:Content-Length 1154110(1.1MB) 云服务器(ECS)在收到请求后

Wireshark抓包分析从入门到精通

曾近有个牛逼的实战课程放在你的面前,你不懂得好好珍惜,直到失去后才追悔莫及,如果G-LAB可以给你再来一次的机会,你会不会抓住?没错,G-LAB真的给了你再来一次的机会.[Wireshark抓包分析从入门到精通]主讲<郭主任>(月光宝盒索取)请联系QQ:2853771084

TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuit抓包分析

TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuite抓包分析