话说下午有一朋友发我一链接懂车帝某视频,让我帮忙看一下这个网页中视频链接是怎么获取的。我断断续续地花了两三个小时,最后终于把它给拿下了。在整个分析的过程中,我觉得还算是有点意思,所以写下这便博客,记录一下。
话不多说,撸起袖子就是干。我打开了网页,并打开了 开发者工具 ,并在 network选项卡中清除掉请求,重新刷新页面。
elements模块 src就有这个视频的链接,应该不是这么简单吧,不然也不至于问我。所以,我去doc源码中找相关的字段,看有没有。
一找,果然没有。所以,那一段html文本是通过js动态渲染进页面的。
全局搜索后,发现是在这个js中进行动态渲染的。所以,去这个js文件中找相关的代码块。
刚好这里就有,果然,this.videoList要重点关注一下。
根据videoList, 加上断点调试呀!
COMMAND+R刷新,Chrome就是这点好,会在断点的地方停住。好,来看看,现在发生了什么了。
说明这个时候,src链接已经计算出来了,正是我想要的。那太好了。接着我又往上看,发现了i中的src就是那个值,也已经计算出来了。
到目前为止,加密函数就是base64decode 入口参数就是t.main_url,故现在的目标一方面是找到base64decode,另一方面是找到t.main_url从何而来。发现这个函数并无特别之处,直接运行这个函数就可以得到相应的链接了。
此时真相大白了,现在去console控制台验证下是不是我发现的那样。
点开链接,果然就是我想要的那个链接。到现在,我以为已经搞定了,所以就跟朋友说了一下思路,并把关键步骤给他截图了。
可是,没过多久,我那朋友说,t.main_url这个参数也是通过一个js加载的,对方服务器通过正确的请求并返回值,返回值里面就有main_url这个值。但是,这个js请求有2个参数r, s全局找不到,估计也是加密了。什么,What the fuck? 二次加密???这个网站有点意思哦,我倒要看看是怎么加密的。话说,首先定位请求的js,果然,这两串数字有点长,而且毫无规律。
根据&logo_type进行全局搜索,发现这里最可疑,我猜n就应该是刚才那个链接。
打上断点,再次刷新,看看。
说明,在这里,这个加密链接已经计算出来了。加密函数是o.crc32 注入参数是 r.config.remoteURL 和 r.config.videoID所拼接起来的字符串。
这个r.config.remoteURL 好说,是个常量。
这个在哪里呢,全局搜一下试试看
两个注入的参数已经搞定了,现在就是来研究下这个加密函数了。加密函数其实也不难,好好分析一下。
第一处和第三处删掉,第二处因为t.pathname几乎是个常量,直接替换掉。在console验证下,看是否是刚才所推论的那样。
这个例子其实拿来练习js逆向破解挺好的,稍微有点耐心,就可以推出来。首先是通过url或者网页源码来选一个标志性的关键词,去js中定位代码块,然后发现可疑的地方。打上断点,然后js断点调试,利用好 Call Stack 可以事半功倍。断点调试的目的,一是定位加密的函数,二是回溯函数入口参数是从哪里来。最后的话,分析下加密函数代码块,做适当的修改。同时利用console可以很好地验证刚才的推想。总之,js逆向调试破解,是个不归路,多加练习,慢慢才会找到感觉的。