吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 34703|回复: 636
上一主题 下一主题

[原创] 某站视频真实地址解析过程

    [复制链接]
跳转到指定楼层
楼主
发表于 2017-9-7 19:02 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 fjqisba 于 2018-1-3 13:00 编辑

前不久看到一篇关于BibiBili视频地址解析的源码,正好有兴趣,就自己也研究了研究,记录一下。

1.以http://www.bilibili.com/video/av12535537/ 此视频为例HttpWatch抓包,很容易就能看出视频的地址是从https://interface.bilibili.com/playurl?quality=4&player=1&cid=20627240&ts=1504780011&sign=f37df88434579a4b009a2bee708a2a71&qn=112里获取的
按照常例分析下参数:
cid很容易猜测出是视频的ID,在网页源码里面也能找到


Qualityqn是视频的清晰度
ts则是时间戳,这个也不用多说
关键就是这个sign,在HttpWatch中是完全搜不到任何相关的信息的,但网页访问了http://static.hdslb.com/play.swf这个文件,那么sign算法很可能就在这个播放器里。

2.下载这个SWF文件后,载入AS3 Sorcerer,代码一大片不是很好找



那就保存到文本里,在文本中查找视频地址这个关键字。



很快就能定位到关键的函数LoadPreviewLoadCidVideo那么接着搜索LoadPreviewLoadCidVideo定位到函数部分,可以看到代码如下




那么关键算法就是在getSigngetSign_v2里面了
[Actionscript3] 纯文本查看 复制代码
public function getSign(_arg_1:String):String
    {
        var _local_2:int;
        var _local_4 = null;
        var _local_7:int;
        var _local_8:int;
        var _local_6:int;
        var _local_5:int;
        var _local_3:int = ESP;
        _local_2 = _local_3;
        _local_3 = (_local_3 - 48);
        _local_5 = 16;
        _local_6 = (_local_2 - 37);
        ESP = (_local_3 & -16);
        _local_7 = CModule.mallocString(_arg_1);
        _local_8 = _arg_1.length;
        do 
        {
            var _local_9:int = (L__2E_str2 - _local_5);
            _local_9 = li8((_local_9 + 16)) /*FlasCC (Alchemy)*/ ;
            _local_3 = (_local_3 - 16);
            si32(_local_9, (_local_3 + 4)); //FlasCC (Alchemy)
            si32(_local_6, _local_3); //FlasCC (Alchemy)
            ESP = _local_3;
            F_sprintf();
            _local_3 = (_local_3 + 16);
            _local_5 = (_local_5 + -1);
            _local_6 = (_local_6 + 2);
        } while (_local_5 != 0);
        _local_3 = (_local_3 - 16);
        _local_9 = (_local_2 - 4);
        si32(_local_9, (_local_3 + 12)); //FlasCC (Alchemy)
        _local_9 = (_local_2 - 37);
        si32(_local_9, (_local_3 + 8)); //FlasCC (Alchemy)
        si32(_local_8, (_local_3 + 4)); //FlasCC (Alchemy)
        si32(_local_7, _local_3); //FlasCC (Alchemy)
        ESP = _local_3;
        F_get_sign();
        _local_3 = (_local_3 + 16);
        _local_5 = eax;
        _local_9 = li32((_local_2 - 4)) /*FlasCC (Alchemy)*/ ;
        _local_4 = CModule.readString(_local_5, _local_9);
        if (_local_7 != 0)
        {
            _local_3 = (_local_3 - 16);
            si32(_local_7, _local_3); //FlasCC (Alchemy)
            ESP = _local_3;
            F_idalloc();
            _local_3 = (_local_3 + 16);
        };
        if (_local_5 != 0)
        {
            _local_3 = (_local_3 - 16);
            si32(_local_5, _local_3); //FlasCC (Alchemy)
            ESP = _local_3;
            F_idalloc();
            _local_3 = (_local_3 + 16);
        };
        var _local_10 = _local_4;
        _local_3 = _local_2;
        ESP = _local_3;
        return (_local_10);
    }
}//package com.bilibili.interfaces


[Actionscript3] 纯文本查看 复制代码
public function getSign_v2(_arg_1:String, _arg_2:int):String
    {
        var _local_12:*;
        var _local_3:int;
        var _local_5 = null;
        var _local_6:int;
        var _local_11:int;
        var _local_8:int;
        var _local_10:int;
        var _local_9:int;
        var _local_4:int = ESP;
        _local_3 = _local_4;
        _local_4 = (_local_4 - 48);
        _local_6 = _arg_2;
        if (_local_6 >= 5)
        {
            _local_12 = _arg_1;
        }
        else
        {
            _local_8 = (L__2E_str2 + (_local_6 << 4));
            _local_9 = 16;
            _local_10 = (_local_3 - 37);
            ESP = (_local_4 & -16);
            _local_6 = CModule.mallocString(_arg_1);
            _local_11 = _arg_1.length;
            do 
            {
                var _local_7:int = (_local_8 - _local_9);
                _local_7 = li8((_local_7 + 16)) /*FlasCC (Alchemy)*/ ;
                _local_4 = (_local_4 - 16);
                si32(_local_7, (_local_4 + 4)); //FlasCC (Alchemy)
                si32(_local_10, _local_4); //FlasCC (Alchemy)
                ESP = _local_4;
                F_sprintf();
                _local_4 = (_local_4 + 16);
                _local_9 = (_local_9 + -1);
                _local_10 = (_local_10 + 2);
            } while (_local_9 != 0);
            _local_4 = (_local_4 - 16);
            _local_7 = (_local_3 - 4);
            si32(_local_7, (_local_4 + 12)); //FlasCC (Alchemy)
            _local_7 = (_local_3 - 37);
            si32(_local_7, (_local_4 + 8)); //FlasCC (Alchemy)
            si32(_local_11, (_local_4 + 4)); //FlasCC (Alchemy)
            si32(_local_6, _local_4); //FlasCC (Alchemy)
            ESP = _local_4;
            F_get_sign();
            _local_4 = (_local_4 + 16);
            _local_10 = eax;
            _local_7 = li32((_local_3 - 4)) /*FlasCC (Alchemy)*/ ;
            _local_5 = CModule.readString(_local_10, _local_7);
            if (_local_6 != 0)
            {
                _local_4 = (_local_4 - 16);
                si32(_local_6, _local_4); //FlasCC (Alchemy)
                ESP = _local_4;
                F_idalloc();
                _local_4 = (_local_4 + 16);
            };
            if (_local_10 != 0)
            {
                _local_4 = (_local_4 - 16);
                si32(_local_10, _local_4); //FlasCC (Alchemy)
                ESP = _local_4;
                F_idalloc();
                _local_4 = (_local_4 + 16);
            };
            _local_12 = _local_5;
        };
        _local_4 = _local_3;
        ESP = _local_4;
        return (_local_12);
    }
}//package com.bilibili.interfaces


可以看到,二者代码非常相似,而且光看代码无法找到有用的信息,那么就得想办法去调试了
3.目前我只知道的办法是:使用JPEXS反编译软件来修改SWF代码(插Log),然后通过Fiddler劫持替换SWF,通过显示Log信息来进行调试
要显示log信息就得安装debug版本的flash
http://www.adobe.com/support/flashplayer/debug_downloads.html

为方便阅读日志信息可以安装Cygwin

具体步骤我也是参考了http://blog.csdn.net/hot_vc/article/details/50600717这篇文章
————————————————————————————————————————————————————————————————————————————
将SWF载入JPEXS

要想修改SWF的源码就得去修改PCODE,第一次接触这种也不是很懂,觉得有点类似于C#的IL代码
通过AS3代码和PCODE代码的一一进行对比,还是能找到一些规律的
为了查看代码中变量值,用到以下代码
[JavaScript] 纯文本查看 复制代码
findpropstrict Qname(PackageNamespace(""),"trace")
getlocal 5
callpropvoid Qname(PackageNamespace(""),"trace") 1

这个代码就相当于trace(_loc5_);
修改保存后利用Fiddler来劫持替换我们的SWF

这样Cygwin就能输出我们想要看到的结果了。
其中有些变量的值是地址,而不是数据,为了读取地址中的数据,利用到了这句代码CModule.readString(地址,读取长度);
按照原PCODE的格式,写出插LOG时的PCODE
[Asm] 纯文本查看 复制代码
pushint 60
setlocal 8
getlex Qname(PackageNamespace("com.bilibili.interfaces"),"CModule")
getlocal 7
getlocal 8
callproperty Qname(PackageNamespace(""),"readString") 2
coerce_s
setlocal 5
findpropstrict Qname(PackageNamespace(""),"trace")
getlocal 5
callpropvoid Qname(PackageNamespace(""),"trace") 1

此代码相当于
_loc8_:int = 60;
_loc5_:* = CModule.readString(_loc7_,_loc8_);
trace(_loc5_);

4.其实关键算法在F_get_sign()中,因为从F_get_sign()函数中出来后,eax中就已经存放带着sign的视频URL的地址了。
F_get_sign()函数过于复杂,总之通过不断地插这两种Log查看变量信息,最终找到了算法



由这个地方可以看出是MD5,还有一个位置能够准确地查看到进行MD5处理的数据(已经忘了.....)
算法如下:

五种清晰度
qn=16,quality=1
qn=32,quality=5
qn=48,quality=2
qn=64,quality=2
qn=80,quality=3
qn=112,quality=4

三种类型的视频bili2,bangumi,movie

bili2:
time = F_clock_gettime();//相当于取一个时间随机数

sign = MD5(“cid=” + cid + “&player=1&qn=112&quality=4&ts=” + time + “1c15888dc316e05a15fdd0a02ed6584f”)

url  =  “https://interface.bilibili.com/playurl?player=1&qn=112&cid=” + cid + “&quality=4&ts=” + time + “&sign=” + sign

bangumi:
time = F_clock_gettime();//相当于取一个时间随机数

sign = MD5(“cid=” + cid + “&module=bangumi” + “&player=1” + “&qn=112” + “&quality=4” + “&ts=” + time + “9b288147e5474dd2aa67085f716c560d”)

url  =  “https://bangumi.bilibili.com/player/web_api/playurl?cid=” + cid + “&player=1” + “&module=bangumi” + “&qn=112” + “&quality=4&ts=” + time + “&sign=” + sign

movie:
time = F_clock_gettime();//相当于取一个时间随机数

sign = MD5(“cid=” + cid + “&module=movie” + “&player=1” + “&qn=112” + “&quality=4” + “&ts=” + time + “9b288147e5474dd2aa67085f716c560d”)

url  =  “https://bangumi.bilibili.com/player/web_api/playurl?cid=” + cid + “&player=1” + “&module=movie” + “&qn=112” + “&quality=4&ts=” + time + “&sign=” + sign



也就只分析到了这里
顺便说下,有些tx.acgvideo.com开头的视频无法下载是因为服务器检查了Refer,只要在协议头里面加入Refer:https://static.hdslb.com/play.swf,就能下载了

水平有限,分析若有什么错误,大家看着办吧

免费评分

参与人数 296吾爱币 +299 热心值 +275 收起 理由
czyphonx + 1 + 1 谢谢@Thanks!
颖火虫 + 1 + 1 我很赞同!
yaont + 1 + 1 用心讨论,共获提升!
王娜娜 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Ganlv + 2 + 1 用心讨论,共获提升!
pvdyoo + 1 + 1 我很赞同!
anqing_2018 + 1 + 1 谢谢@Thanks!
Poko + 1 + 1 谢谢@Thanks!
霁夜茶 + 1 + 1 谢谢@Thanks!
不亦乐乎917 + 1 + 1 谢谢@Thanks!
ATree + 1 + 1 谢谢@Thanks!
ajia + 1 热心回复!
topvip + 1 + 1 谢谢@Thanks!
苏心恒 + 1 + 1 我很赞同!
june_fj + 1 + 1 我很赞同!
wenclick + 1 + 1 已答复!
watking + 1 谢谢@Thanks!
zshq1 + 1 + 1 已答复!
网鱼 + 1 + 1 谢谢@Thanks!
w2828110 + 1 + 1 用心讨论,共获提升!
工口大佐 + 1 + 1 我很赞同!
redfox2005 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zzzm + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
qzeng + 1 牛啊,谢谢分享
xianchao + 1 + 1 用心讨论,共获提升!
baichi00001 + 1 + 1 我很赞同!
monner + 1 + 1 用心讨论,共获提升!
小蚂蚁哈哈乐 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
mamingming22 + 1 + 1 用心讨论,共获提升!
robert99 + 1 + 1 感谢精彩的分享
tututudou + 1 + 1 感谢楼主分享过程~有两个小问题,F_clock_gettime();是网站自定义的获取视.
520dman + 1 + 1 用心讨论,共获提升!
根本英俊 + 1 + 1 谢谢@Thanks!
dybala + 1 + 1 我很赞同!
geek_NO1 + 1 + 1 谢谢@Thanks!
zmywsw + 1 + 1 我很赞同!
Domino2017 + 1 谢谢@Thanks!
wf21900312 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
大九丶 + 1 用心讨论,共获提升!
UserXCH + 1 + 1 我很赞同!
吾来搬砖 + 1 热心回复!
cocomail + 1 + 1 用心讨论,共获提升!
排排坐 + 1 + 1 学习一下,谢谢楼主哦
yiyu4444 + 1 + 1 用心讨论,共获提升!
lonely_coder + 1 + 1 用心讨论,共获提升!
welfare520 + 1 + 1 我很赞同!
ft17271960 + 1 + 1 谢谢@Thanks!
hukaifeng_1023 + 1 用心讨论,共获提升!
lnany + 1 热心回复!
落水的小鹿 + 1 + 1 已答复!
当合 + 1 + 1 热心回复!
carlwei + 1 热心回复!
GD:1412 + 1 + 1 谢谢@Thanks!
释氺哖華 + 1 + 1 用心讨论,共获提升!
335505 + 2 + 1 膜拜大神
阳光般丶楠神 + 1 高手就是高手,真腻害了我的哥
jkl718293 + 1 + 1 热心回复!
moon1981911 + 1 + 1 我很赞同!
kil20 + 1 用心讨论,共获提升!
gomg007 + 1 + 1 用心讨论,共获提升!
lvgang + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
onexiao + 1 + 1 已答复!
不爱说话的黄子 + 1 + 1 谢谢@Thanks!
tcjj3 + 1 + 1 谢谢@Thanks!
airwu + 1 谢谢@Thanks!
jiajia008 + 1 + 1 用心讨论,共获提升!
hearne + 1 + 1 用心讨论,共获提升!
idea + 1 + 1 这种大神为什么还活着?
Love冥天 + 1 + 1 用心讨论,共获提升!
zq13553192681 + 1 + 1 我很赞同!
zzzz438 + 1 + 1 用心讨论,共获提升!
风火不离 + 1 + 1 我很赞同!
伟殿天下 + 1 我很赞同!
heimu360 + 1 + 1 热心回复!
淡忘° + 1 + 1 谢谢@Thanks!
海绵foryou + 1 + 1 用心讨论,共获提升!
Papge101 + 1 + 1 用心讨论,共获提升!
aipanpann + 1 + 1 已答复!
云水禅心03 + 1 + 1 谢谢@Thanks!
jinyan + 1 + 1 已答复!
lapop + 1 + 1 我很赞同!
fnzero + 1 + 1 我很赞同!
外星人11 + 1 我很赞同!
starh + 1 + 1 谢谢@Thanks!
看戏的大k + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
123-木头人 + 1 + 1 谢谢@Thanks!
caoxin052 + 1 + 1 谢谢@Thanks!
zamliage + 1 + 1 楼主是如此之强大!
不想告诉你 + 1 + 1 谢谢@Thanks!
aimenl + 1 + 1 666
那么0我会 + 1 + 1 辛苦了 。。
outlook + 1 + 1 热心回复!
webmarksman + 1 + 1 谢谢@Thanks!
丶峰宇 + 1 + 1 我很赞同!
fengshu + 1 + 1 牛逼+1
湮玖 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
1213999191 + 1 + 1 热心回复!
WAPJ1111 + 1 热心回复!
mopp163 + 1 + 1 不明觉厉
Monly + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

头像被屏蔽
推荐
发表于 2017-9-19 02:07 | 只看该作者
提示: 该帖被管理员或版主屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

推荐
发表于 2017-9-8 17:42 | 只看该作者

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

板凳
发表于 2017-9-7 21:16 | 只看该作者

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

报纸
发表于 2017-9-8 08:31 | 只看该作者
感谢楼主分享心得,学习了!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

地板
发表于 2017-9-8 08:49 | 只看该作者
太牛了,要是有个视频教程看更好

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

7#
发表于 2017-9-8 12:29 | 只看该作者
学习一下.

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

8#
发表于 2017-9-8 12:44 | 只看该作者
借来研究 一下……

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

9#
发表于 2017-9-8 13:10 | 只看该作者
学习思路 谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

10#
发表于 2017-9-8 14:09 | 只看该作者
感谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

11#
发表于 2017-9-8 16:44 | 只看该作者
对了.我想知道谁有解析解析音频节目的思路

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Service@52PoJie.Cn

快速回复 收藏帖子 返回列表 搜索

RSS订阅|手机版|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2018-2-23 10:42

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表