宝刀不老:Flash歌曲播放网站MP3地址隐藏机制完全破解

晚上,小落给推荐了一首非常好听的Folk名谣,说是网上很难找到的。:)给了一个地址:http://www.neocha.com/naivete/music!1657.html

听了之后,很是喜欢这种风格。然后baidu了一个下载地址发给她,说是这个flashMP3的地址,后来非要让我如何找到的….冂冏囧….只好拾起尘封了n久的hack技术

      

       首先查看Page Source,找到相关的一段:

 

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"

codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="280" height="277" id="musicMovie" align="middle">

<param name="movie"

value="/-/flash/music_player_dq.v28.swf?id=1657&un=naivete">

       <param name="quality" value="high">

       <param name="wmode" value="transparent">

 

       <embed src="/-/flash/music_player_dq.v28.swf?id=1657&un=naivete" quality="high"

wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer"

type="application/x-shockwave-flash" width="280" height="277"

name="musicMovie">

</embed>

</object>

                                                                                            </object>

       初步猜想,恩,MP3的相关的信息保存在一个xml文件里面,只需要找到这个xml,然后找到里面的mp3的对应地址就ok了。这也是类似的网站经常使用的技术。。。

       根据上面的object的信息,拼起来了这个地址然后打开:

http://www.neocha.com/-/flash/music_player_dq.v28.swf?id=1657&un=naivete

恩,这个是一个flash,初步思路是获取到这个flash,然后反编译一下,看看是读取的哪个地方的MP3URLok了。

抄起迅雷,添加下载信息,直接填上这个链接,把这个flash下载下来。下载之后得到这个文件名的东西:music_player_dq.widget.v26.swf

抄起闪客精灵,反编译之

 

然后查看一共21个动作的Script脚本。。。

功夫不负有心人,在名称为sprite64的动作脚本中发现了比较敏感的东西:

 

function loadXMl()

    {

        myxml = new com.makeit.xmlClass("music_playlist.xml");

        var _l2 = new Object();

        function xmlComplete(albumArr, musicArray, parameterArr)

        {

            com.makeit.musicDocument.thisObj.albumArr = albumArr.slice();

            com.makeit.musicDocument.thisObj.musicArray = musicArray.slice();

            com.makeit.musicDocument.thisObj.parameterObj = parameterArr;

            com.makeit.musicDocument.thisObj.setFunc();

        } // End of the function

        myxml.addListener(albumArr);

    } // End of the function

 

啊哈,Load Xml。而且xml文件的名称都有了,恩,立马蹭蹭蹭的构造了几个xml的路径:

http://www.neocha.com/naivete/music_playlist.xml

http://www.neocha.com/-/flash/music_playlist.xml

http://www.neocha.com/-/xml/music_playlist.xml

….

啥都没有。。sad。。不泄馁,继续寻寻觅觅,终于,在这个动作的下一个动作里面发现了感兴趣的东西:

function loadXml()

    {

        static function onLoad(success)

        {

            if (success)

            {

                com.makeit.xmlClass.thisObj.parseAlbum_fun();

            } // end if

        } // End of the function

        if (_root.id == undefined)

        {

            id = "3378";

        } // end if

        if (_root.un == undefined)

        {

            un = "banana_monkey";

        } // end if

        myxml.load("http://www.neocha.com/-/xml/music_player.jsp?id=" + _root.id +

"&un=" + _root.un + "&a=" + Math.random() * 9999);

    } // End of the function

 

看到这里俺就开始得意了,胜利就在眼前了,迅速构造一地址:

http://www.neocha.com/-/xml/music_player.jsp?id=3378&un= banana_monkey&a=9999

       使用IE打开去,结果很差很失望,打不开,找不到这个地址。恩,转变思路,这个jsp文件应该是负责后台的某些逻辑处理的,关掉IE,迅雷上。

       果然,出现重大转机,下载得到的文件打开如下:

 

<?xml version='1.0' encoding='UTF-8'?>

<music-player>

       <albums>             

       <album>

       <album-id>0</album-id>

       <album-title>未分类&nbsp;</album-title>                  <album-picture>http://www.neocha.com/-/res/banana_monkey/20080414131625686093_t.jpg</album-picture>

       <album-link>http://www.neocha.com/banana_monkey/record!0.html</album-link>

       <musics>                           

       <music>

       <music-id>3378</music-id>

       <music-title>Baby in Red (Lovely Version)</music-title>                         <music-picture>http://www.neocha.com/-/res/banana_monkey/20080414131625686093_o.jpg</music-picture>                               <music-file>http://www1.neocha.com:90/-/res/banana_monkey/20080414131625702094.mp3</music-file>                              <music-link>http://www.neocha.com/banana_monkey/music!3378.html</music-link>

                                   <music-artist>Banana Monkey&nbsp;</music-artist>

                                   <music-album>未分类&nbsp;</music-album>

                                   <music-corp>&nbsp;</music-corp>

                                   <music-publish>&nbsp;</music-publish>

                                   <music-genres>Rock摇滚,8-Bit8比特&nbsp;</music-genres>

                                   <music-comment-cnt>0</music-comment-cnt>                                     <music-comment-url>http://www.neocha.com/banana_monkey/music!3378.html#comment</music-comment-url>                         

<music-favorite-cnt>0</music-favorite-cnt>                                   <music-favorite-url>http://www.neocha.com/banana_monkey/music!3378.html</music-favorite-url>

       <music-vote-cnt>0</music-vote-cnt>                              <music-vote-url>http://www.neocha.com/banana_monkey/music!3378.html</music-vote-url>

       <music-favorited>2</music-favorited>

</music>

       </musics>

       </album>

       </albums>

 

       <username>banana_monkey</username>

       <user-url>&nbsp;</user-url>

       <user-picture>&nbsp;</user-picture>

       <default-album-id>0</default-album-id>

       <!-- 默认播放的专辑 -->

       <auto-start>1</auto-start>

       <!-- 1自动 0 手动 播放-->

       <color1>#000000</color1>

       <color2>#999999</color2>

       <color3>#FFFF00</color3>

       <color4>#FFFF00</color4>

 

</music-player>

<script src="http://www.neocha.com/-/js/urchin.js" type="text/javascript"></script>

<script type="text/javascript">

_uacct = "UA-828246-1";

urchinTracker();

</script>

 

看到没,看到MP3这个后缀的时候,第一感觉找到了。

不过很遗憾,下载了这首MP3之后发现,是一首Rock…

 

感觉世界一下灭了。。这个时候决定转变思路。。

 

抄起嗅探工具,好多年前的winsock也不在身边了,唉,只好问liunice要一个ie的插件,装了起来….

看来又要分析IE的数据包了

 

安装插件的时候,仔细的看了下载的这个文件的格式,忽然灵光一现,music标签下面的不就是动作script里面的好多的参数的么。。豁然开朗了:

这个文件就是上面的那个jsp文件根据参数读取数据库动态生成的flashMP3文件地址的xml配置文件。

找到了key Point

<music-link>http://www.neocha.com/banana_monkey/music!3378.html</music-link>

打开这个链接,链接的格式是如此的熟悉,打开之后,出现了刚才的那个下载的熟悉的bananaRockoh yeah

 

搞定!

 

回到开头的最开始安小落MM发的URL

http://www.neocha.com/naivete/music!1657.html

根据这个URL来构造这首MP3

http://www.neocha.com/-/xml/music_player.jsp?id=3378&un= banana_monkey&a=9999

两个地址相加,得到最终地址:

http://www.neocha.com/-/xml/music_player.jsp?id=1657&un=naivete&a=9999

 

迅雷下载这个URL,在<music-file>标签找到了想要的东西:

<music-file>http://www1.neocha.com:90/-/res/naivete/20071124214646754207.mp3</music-file>

呵呵,剩下的事情,就是永久的拥有这首好听的“穿格子衬衫的teddy熊”了。

恩,还有,破解和这个网站整个的flash播放音乐隐藏真实地址是如何实现的。。不过这不是主要目的。。

 

lbq1221119 5/24/2008 11:26:19 PM 首发lbq1221119.cnblogs.com

好的,以下是一个简单的成语接龙菜单程序,可以供参考: ```python import random # 成语字典,以首字为键,成语为值 idioms = { 'a': {'啊': None, '爱不释手': None, '安然无恙': None}, 'b': {'百年大计': None, '宝刀不老': None, '半途而废': None}, 'c': {'春风得意': None, '出奇制胜': None, '长驱直入': None}, 'd': {'大言不惭': None, '断章取义': None, '东山再起': None}, 'e': {'尔虞我诈': None, '恶贯满盈': None, '恩威并施': None}, 'f': {'风华正茂': None, '凤凰于飞': None, '繁荣昌盛': None}, 'g': {'高山流水': None, '孤掌难鸣': None, '孤注一掷': None}, 'h': {'海阔天空': None, '横扫千军': None, '荒谬绝伦': None}, 'j': {'金玉满堂': None, '精卫填海': None, '将心比心': None}, 'k': {'开门见山': None, '口吐芬芳': None, '苦口婆心': None}, 'l': {'兰亭序': None, '龙马精神': None, '两全其美': None}, 'm': {'名列前茅': None, '面面俱到': None, '迷途知返': None}, 'n': {'弄假成真': None, '年富力强': None, '宁死不屈': None}, 'p': {'破釜沉舟': None, '平步青云': None, '披荆斩棘': None}, 'q': {'千里之堤毁于蚁穴': None, '青出于蓝': None, '千姿百态': None}, 'r': {'人浮于事': None, '如火如荼': None, '任重道远': None}, 's': {'三位一体': None, '水到渠成': None, '世外桃源': None}, 't': {'天马行空': None, '同舟共济': None, '谈笑风生': None}, 'w': {'未雨绸缪': None, '无中生有': None, '无忧无虑': None}, 'x': {'心悦诚服': None, '胸有成竹': None, '虚怀若谷': None}, 'y': {'一路顺风': None, '以德服人': None, '有口皆碑': None}, 'z': {'走马观花': None, '自由自在': None, '纸上谈兵': None} } # 人机对战函数 def human_vs_computer(): print('欢迎进行人机对战!') while True: # 随机选择一个首字母 initial = random.choice(list(idioms.keys())) print('请以“{}”字开头,输入一个成语:'.format(initial)) # 等待用户输入 user_input = input() # 判断输入的成语是否合法 if user_input not in idioms[initial]: print('输入不合法,请重新输入。') continue # 选择一个以输入成语结尾的成语作为电脑回答 next_idiom = None for idiom in idioms[user_input[-1]]: if idiom != user_input and idiom not in idioms[initial]: next_idiom = idiom break # 如果没有合适的成语可以回答,电脑认输 if next_idiom is None: print('恭喜你,你赢了!') break print('电脑回答:{}'.format(next_idiom)) # 机机对战函数 def computer_vs_computer(): print('欢迎进行机机对战!') # 随机选择起始首字母 initial = random.choice(list(idioms.keys())) print('首个成语:{}'.format(random.choice(list(idioms[initial])))) while True: # 选择一个以上一个成语结尾的成语作为回答 next_idiom = None for idiom in idioms[initial]: if idiom != user_input and idiom not in idioms[initial]: next_idiom = idiom break # 如果没有合适的成语可以回答,认输 if next_idiom is None: print('电脑1认输,电脑2获胜!') break print('电脑1回答:{}'.format(next_idiom)) # 选择一个以回答成语结尾的成语作为下一个回答 initial = next_idiom[-1] next_idiom = None for idiom in idioms[initial]: if idiom != user_input and idiom not in idioms[initial]: next_idiom = idiom break # 如果没有合适的成语可以回答,认输 if next_idiom is None: print('电脑2认输,电脑1获胜!') break print('电脑2回答:{}'.format(next_idiom)) # 主函数 def main(): print('欢迎来到成语接龙游戏!请选择游戏模式:') print('1. 人机对战') print('2. 机机对战') while True: mode = input() if mode == '1': human_vs_computer() break elif mode == '2': computer_vs_computer() break else: print('输入不合法,请重新输入。') if __name__ == '__main__': main() ``` 在此程序中,我们使用了一个字典来存储成语,以首字母为键,成语为值,多个首字母相同的成语放入一个集合中。之后,我们分别实现了人机对战和机机对战的功能,并在主函数中提供了选择游戏模式的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值