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


#1

如题,笔者使用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的实例见下图


#2

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


#3

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


#4

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


#5

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


#6

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


#7

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


#8

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


#9

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

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