Flash Socket应用
页面使用 Socket 底层传输数据的方便比传统的 HTTP 协议更隐秘,浏览器基本不对基于 TCP 通信的 Socket 进行监测,因此也无法通过浏览器提供的开发者工具来探测网站的受保护数据。例如,音悦台网站上的高铃 - 爱してる-高清【MV】,其视频内容通过 Socket 进行传输,浏览者根本发现不了其视频数据,也无法找到浏览器有缓存到数据。
打开视频网页: http://v.yinyuetai.com/video/37962
但,使用其他工具还是可以找到服务器所在的,Windows 下就有 netstat 命令可以检测到,注意 843 端口,这是 Flash Socket 用来安获取 crossDomain.xml 的首选端口:
C:\>netstat -a -o -b -p TCP
活动连接
协议 本地地址 外部地址 状态 PID
TCP 192.168.1.200:59539 125.89.72.215:http ESTABLISHED 1128
[chrome.exe]
TCP 192.168.1.200:59548 219.232.246.244:http ESTABLISHED 1128
[chrome.exe]
TCP 192.168.1.200:61073 125.89.74.163:http TIME_WAIT 0
TCP 192.168.1.200:60700 14.17.110.3:843 TIME_WAIT 0
TCP 192.168.1.200:60701 14.17.110.3:82 TIME_WAIT 0
TCP 192.168.1.200:60706 tg-in-f100:https SYN_SENT 1128
[chrome.exe]
TCP 192.168.1.200:60707 tg-in-f100:https SYN_SENT 1128
[chrome.exe]
TCP 192.168.1.200:60748 183.136.237.25:843 TIME_WAIT 0
TCP 192.168.1.200:60749 183.136.237.25:82 TIME_WAIT 0
TCP 192.168.1.200:60758 183.136.237.25:82 TIME_WAIT 0
TCP 192.168.1.200:60760 121:8180 FIN_WAIT_1 1128
[chrome.exe]
TCP 192.168.1.200:60761 183.136.237.25:82 TIME_WAIT 0
TCP 192.168.1.200:60764 121:8180 ESTABLISHED 1128
[chrome.exe]
按843端口的地址请求一份 crossDomain.xml 来,结果是这样的,好大方的两颗星:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>
浏览开始请求页面,服务输出 HTML 数据,通过解析 HTML 数据后,得到加载指令,进而执行一系列请求,而这里应该注意的是以下三个 SWF 文件,还有 videoID=93425,它们是视频数据的直接关联部分。
http://acjs.aliyun.com/flash/JSocket.swf
http://irs01.net/MTFlashStore.swf
http://s.yytcdn.com/swf/common/mvplayer.swf
如果人品够好直接找到这人JSON文件,就可以直接下载视频了,其实只要.flv之前这部分系统就会自动跳转到视频的CDN服务器:
http://hc.yinyuetai.com/uploads/videos/common/32A00127BA9B8DBB4FA3B950FEC648DF.flv?sc=c4ba59bdfb7b1eb5&br=688&vid=37962&aid=3585&area=JP&vst=0&ptp=mv&rd=yinyuetai.com&json=1
到这里,其实不用再去深挖 mvplayer.swf 里的东西了,基本确定它会将视频ID 37962 和 32A00127BA9B8DBB4FA3B950FEC648DF 这块编码联系起来,至于算法肯定不是 MD5 SHA 等等常见指纹摘要算法,需要通过分析 mvplayer.swf 理清。主要是因为,虽然网站使用了要 Socket 来做视频的数据传输,但仍然是基于 HTTP 协议的传输,逻辑上并没增加保密性代码,因此只是绕过了浏览的监视而以。
Wireshark 抓包与分析
再用 Wireshark 抓包看视频在什么服务器上,这里运行一个没有过滤器抓包任务,这种情况下会相对混乱,因为抓的包多,尽量还要运行其它不相关的程序或打开不相关的网站。注意页面加载视频的时候,Wireshark 会抓到相关的包,而且这些包通常会比较大。需要分拆发送,所以会有显眼的 [TCP segment of a reassembled PDU] 字样。挑一个出来,选择右键菜单的 Follow TCP Stream,出来一个对话框,人品好的话一下就中了:
GET /6/r/b/m/f/rbmftmwaxhcnxjnuqdqfipkuesverx/hc.yinyuetai.com/32A00127BA9B8DBB4FA3B950FEC648DF.flv?sc=c4ba59bdfb7b1eb5&br=688&vid=37962&aid=3585&area=JP&vst=0&ptp=mv&rd=yinyuetai.com HTTP/1.1
Accept: */*
Host: 222.243.215.138
Referer: yytcdn.com
Range: bytes=25067520-27569147
Connection: Keep-Alive
HTTP/1.1 206 Partial Content
Server: T1-CACHE/
Date: Mon, 10 Aug 2015 09:11:30 GMT
Content-Type: video/mp4
Content-Length: 2501628
Last-Modified: Tue, 15 Oct 2013 17:09:35 GMT
Connection: keep-alive
ETag: "525d76cf-1a4abfc"
Expires: Tue, 09 Aug 2016 09:11:30 GMT
Cache-Control: max-age=31536000
Content-Range: bytes 25067520-27569147/27569148
GET /10/x/h/c/h/xhchgxmdjndpeymboepyeqiallvljn/hc.yinyuetai.com/F466013AB6C9120E52E98349C292DE47.flv?sc=8e15b0cae1d004a0&br=777&vid=398619&aid=994&area=JP&vst=0&ptp=mv&rd=yinyuetai.com HTTP/1.1
Accept: */*
Host: 125.89.74.163
Referer: yytcdn.com
Range: bytes=0-1
Connection: Keep-Alive
HTTP/1.1 206 Partial Content
Server: T1-CACHE/
Date: Mon, 10 Aug 2015 09:40:03 GMT
Content-Type: video/mp4
Content-Length: 2
Last-Modified: Fri, 15 May 2015 22:08:32 GMT
Connection: keep-alive
ETag: "55566e60-27e19a3"
Expires: Tue, 09 Aug 2016 09:40:03 GMT
Cache-Control: max-age=31536000
Content-Range: bytes 0-1/41818531
上面两组内容是 HTTP 1.1 协议的头部内容,很显眼的有一个 FLV 文件路径摆在眼前,但是 FLV 服务器不同,显然这是网站为了加速访问做的 CDN - yytcdn.com。有趣的是在 FLV 文件结束处发现有标记: freeIsoMedia File Produced with GPAC 0.4.5 (build 33) ,GPAC 这是个开源的家伙。
结合前面的 crossDomain.xml,试试本地的 JScoket.swf,将前面的请求头一字不差复制,修改其中 Range 的最大值为 1000,发送请求到主机 125.89.74.163 ,可以看到1000字节就这样取下来了,所以 crossDomain.xml 管理不好,Flash Socket 就蛮好用的:
GET /10/x/h/c/h/xhchgxmdjndpeymboepyeqiallvljn/hc.yinyuetai.com/F466013AB6C9120E52