逆向腾讯视频,视频播放链接的接口hook失败求指点

如题,笔者使用monkey dev的配置工程来实现的,前期重签名,安装到手机很顺利,去除闪屏广告也比较快。
但是笔者通过测试发现,腾讯视频登陆后,有一个接口会直接返回该视频的m3u8播放链接,可以直接复制出来到Chrome或Safari播放(有时效),所以想自动把该接口里的m3u8链接复制到剪贴板,方便贴到Safari里播放,本来也以为是hook一下发起请求的接口就好了,结果掉进去一个大坑好几天还没有爬出来。。。

一些信息:
1.该接口的前缀是vv.video.qq.com/getvinfo;
2.视频详情页的控制器类是QLVideoDetailViewController,播放器是QLPlayerViewController;
3.在一些数据源的model里只找到了以下这种数据结构:
jcev2_p_0_r_url: txvideo://v.qq.com/Html5Activity?XXX,
4.正常登陆后该接口返回的m3u8链接大致为:
http://113.105.155.19/vipts.tc.qq.com/XXXX.ts.m3u8?ver=4,
5.该接口是http,没有做加密,其他部分接口虽然是http,但是有做二次加密。

遇到的几个问题:
1.参考该文章http://blog.imjun.net/posts/restore-symbol-of-iOS-app/尝试恢复符号表以查看函数调用堆栈,但是只恢复了OC的符号表,凑巧,这个函数基本都是block的调用,而block符号表没有恢复成功,导致不清楚该函数的调用源头在哪里,如果能恢复block的符号,应该就很容易解决了;
2.通过hook NSURLSession的dataTaskWithRequest:completionHandler:函数发现,该接口传入的completionBlock为nil,这一点一直想不通,如果不需要数据回调的话,数据是怎么回传给播放器播放的呢?另外,不需要回调为何不是直接使用dataTaskWithRequest就好?
3.hook NSURLSession的dataTaskWithRequest:completionHandler:后,手动修改block,随便给一个不为空的block,发现播放器无法播放视频,只有给nil才能播放视频。想不太明白为什么?
4.尝试过手动修改block,对该接口回调的response和data进行解析,发现可以获取到需要的m3u8数据,但是因为block此时已经不为空了,所以触发了上述第3点的问题,视频在iOS上无法播放。。。

两个问题:
1.如何可以既能获取到该接口返回的信息,又能让iOS的播放器继续播放视频呢?
2.block的符号该如何恢复?

hook的实例见下图

获取到之后再调用Super方法 不就可以继续播放了

不是哦,这个断点是断在了block里边的,图片此时其实是网络的回调来着。
hook这个函数的时候,主要就是替换了传给网络框架的completionBlock

自己定义一个Block当参数传进去 然后在自己定义的Block里边调用Hook方法的Block不可以么?

原来的block是nil
这就很尴尬。。。

我抓接口并没有发现视频的m3u8播放链接(6.3.5版本),请问您是怎么获取的。

登录后就有了,未登录没有m3u8播放链接。

你的整个需求是什么,说来听听.看看大家有没有更加简单直接且有效的思路

我的目的是,未登录,或者未购买VIP会员的情况下,也能看VIP才能看的电影。。。
当然实际上我是有腾讯视频的VIP会员的。这是一种技术上的尝试。

我的思路是这样子的,因为发现未登录或者没有购买VIP的情况下,可以观看影片前面5分钟,我猜是客户端做的播放限制,所以想尝试逆向去去掉这个限制。
但是在未登录下,我没有搞清楚播放器是如何播放那5分钟的电影的,因为接口并没有返回一个完整的m3u8链接,只有一部分数据,所以不太清楚播放器内部是怎么做到的。
当然登录后确实返回了电影的完整m3u8播放链接,而且是好几个,虽然有时效限制,但是也是可以拿来用的,不过这样最初的目的还是没有实现呐

我也想达到和你一样的目的,可惜没有实现。

初步分析原因在于:关键接口getvinfo返回的数据,如果是vip用户就返回完整的m3u8;如果不是vip用户就返回前5分钟的m3u8。该接口提交的参数包含了用户信息和要播放的视频信息,而后台完全可以去核实该用户是否有权限观看完整的视频,再决定返回完整的还是部分的m3u8文件url!

哈哈是的,服务器鉴权的,这个破不了,还是买会员吧,买了会员后可以把链接拿到,分享给别人看,虽然这个链接有时效性,但是有一点价值就是,有些电影是收费的或者用券兑换的,你买了以后2天内都可以看,把链接复制出来就可以给别人看了(这一步我没有验证)。

我看了接口数据, 它里面有个key是et对应的数据是300, 而这个300s应该就是对应的试看五分钟, 你可以试着更改这个字段实现整片观看, 如果vip业务在服务器端处理那么他也没必要返回300了! 之前芒果tv是这样的

不用看了,我有朋友在腾讯视频,所以。。。
另外对于视频这种做一次可以一直用的资源来说,切割一个5分钟的短内容,也很容易而且正常的,而且还是前5分钟。