获取斗鱼直播视频的下载地址

斗鱼直播应该火了好一阵了,和每一个互联网新兴业务一样,人气激增到国家都专门为其制定管理政策了。对流行节拍有意而为之的后知后觉,让我近一两个月才关注了几个主播。女主播看脸蛋,也插科打诨来几个污段子,才美兼备的自是不多。男主播的话,就看他套路其他女主播的真人秀,或视频或夜店。

只是直播时间都太晚,看几次就觉得严重影响睡眠,能自动录播就好了。

网页里的播放器自然是用Flash开发的,P2P式的NetStream。如果找到主播房间号对应的NetStream传输地址就可以使用第三方软件去下载视频流了。虽然播放器的主程序是加密传输到本地后载入内存的,但毕竟Loader真正开始加载的时候,该解密的都解了。播放器外部代码还做了混淆,但主程序因为加密放下戒备,真Dump下来的话,可读性极高。

开源的FFDEC出现以后,SWF Decompiler和As3 Sorcerer都再没用过。直播开始后,FFDEC去Dump浏览器进程中的Flash文件,大小1.5M左右的就是解密后的播放器主程序。反编译可以看见代码本身包含调试信息,只要当前页面的URL中包含dydebug的字样,播放器就会调用浏览器的console.log输出不同阶段的中间结果,这当中就包含了NetStream流的地址,形如:

NetConnection连接状态:
NetConnection.Connect.Success 
Param.RtmpUrl =http://hdl3.douyucdn.cn/live   
Param.LiveID=602624rWYVytrxHL_550.flv?wsAuth=00f153fe25aa13a9e735f72774ae495a&token=web-0-602624-bb8f0c410da443bc88baa2c53e8d76c0&logo=0&expire=0

组合RtmpUrl和LiveID就得到了视频地址,直接粘贴到浏览器地址栏就下载视频到本地了。

正好新装了Visual Studio 2015,就写了个下载地址解析的工具,距离上一次使用C#写点什么已经四五年了。Anyway,webBrowser控件很方便,可以自动调用IE引擎打开附加dydebug的直播地址。由于console是浏览器自定义的调试模块,webBrowser作为一个控件需要自行实现一个console供Flash调用。其实也就是在页面加载完毕后,添加一段javascript,声明一个window.console.log,内部调用external.log就能传递消息调试信息给C#代码了。

解析程序是Windows 10的VS2015编译的,其他系统可能要安装.net运行时才能正常运行。输入房间号后,视网络状况,一分钟内可以解析出直播地址并放入剪贴板。

斗鱼直播地址解析程序下载:douyu

douyu

更多实现细节可参考主窗口的代码,为了运行清爽,webBrowser控件会隐藏,视频页面加载时会静音。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace douyu
{
    [System.Runtime.InteropServices.ComVisible(true)]
    public partial class Form1 : Form
    {
        [System.Runtime.InteropServices.DllImport("winmm.dll")]
        public static extern int waveOutGetVolume(IntPtr h, out uint dwVolume);
        
        [System.Runtime.InteropServices.DllImport("winmm.dll")]
        public static extern int waveOutSetVolume(IntPtr h, uint dwVolume);
        
        public Form1()
        {
            InitializeComponent();
            browser.ObjectForScripting = this;
        }

        public void log(String msg)
        {
            if(msg.Contains("NetConnection.Connect.Success"))
            {
                Match res = Regex.Match(msg, "RtmpUrl =(.+?) ");
                String rtmpurl = res.Groups[1].Value;
                res = Regex.Match(msg, "LiveID=(.+)");
                String liveid = res.Groups[1].Value;                
                String url_address = rtmpurl + "/" + liveid;
                /* considering the relocation (Thanks to lipinghao) */
                HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url_address);
                myReq.AllowAutoRedirect = false;
                WebResponse response = myReq.GetResponse();
                if (response.Headers["Location"]!=null)
                {
                    url_address = response.Headers["Location"];
                }
                Clipboard.SetDataObject(url_address);
                resultbox.Text = url_address;
                urlpath.Text = "下载地址已经复制到剪贴板";
            }            
        }

        private uint _savedVolume;
        private void button_parse_Click(object sender, EventArgs e)
        {
            waveOutGetVolume(IntPtr.Zero, out _savedVolume);
            browser.Navigate("http://www.douyu.com/" + urlpath.Text + "?dydebug");
            waveOutSetVolume(IntPtr.Zero, 0);
        }

        private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlElement head = browser.Document.GetElementsByTagName("head")[0];
            HtmlElement scriptEl = browser.Document.CreateElement("script");
            scriptEl.SetAttribute("text", "function hook_console() { window.console = new Object(); window.console.log = function(param){external.log(param)}}");
            head.AppendChild(scriptEl);
            browser.Document.InvokeScript("hook_console");
        }
        
    }
}

Metasploitable http download

毕业设计很大一部分工作都是围绕Metasploit Framework 展开的,因而对他的关注也比较多一些。谁知道这个月GFW竟然已经蔓延到了MSF的blog了,blog.metasploit.com已经无法正常访问了,当然利用google的翻墙或者google reader都可以有效缓解这一窘状。

前一段Metasploit推出了Metasploitable这个操作系统,是以Vmware 6.5的镜像形式发布的,其实就是Ubuntu 8.04 + 各种数据库+各种网络服务,当然都没有打补丁,因而整个系统漏洞随处可见,弱口令,溢出……使用MSF工具时,Metasploitable是一个不错的练手的系统。但可惜在MSF的主站仅提供了torrent的下载,对于教育网的我来说,速度很低,还需要开国际流量,各种不爽啊。http的下载连接,只有Rapid7的customer才能享有,也就是购买了Nexpose或Metasploit Express的人才能享受http下载。

后来挂了好久的迅雷离线下载,总算是下载下来了这个zip,大小为540M。最近之所以这么急着要,主要是学校的ISCC竞赛的实战部分,需要我构建一台有缺陷的主机,最近又要忙着毕设,答辩各种事,所以就使用了Metasploitable。

最后,给出它的http下载连接,我传到了QQ邮箱。下载速度自然没的说,如果是教育网更是飞速啊~

PS:QQ邮箱最近做了限制,可能下载时,会提示下载次数过多等等,如果出现这种情况,希望能有人向我反映一下,或者留下QQ邮箱,我给你发过去都可以。如果提示下载次数过多就登陆自己的QQ邮箱后再点击下载试一下。

下载torrent

最后想说的是,这个文件google的结果是,中国没有一台服务器提供该文件的http下载,国外的网盘虽然有提供的,但速度也不快。所以如果你真的需要,那看到这里你算是赚了~