iOS逆向-如何让抖音自动播放下一个视频(懒人癌)
## 痛点是什么?- 在做饭、锻炼等无法腾出双手的场景中,想刷刷抖音
- 刷抖音的时候有太多的广告
### 如何解决痛点
- 抖音自动播放下一个视频
- 纯净模式
- 通过设置页面进行开关控制
## 知识点:如何在逆向中快速获取block的参数信息 ###
## 工具
- MAC
- 越狱手机
- (https://link.juejin.im/?target=https%3A%2F%2Fgithub.com%2FAloneMonkey%2FMonkeyDev)
- (https://revealapp.com/)
- (https://github.com/ebf/CTObjectiveCRuntimeAdditions)
- FLEXible
## 过程
### 1. 在PP助手下载一个砸壳后的抖音ipa
* * *
### 2. 用MonkeyDev进行class-dump,获取到头文件
* * *
### 3. 在手机上运行起来
> 3.1 第一个问题来了,抖音做了逆向检测,强制弹框,跳转至App Store,如下图所示:
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_01.PNG?raw=true)
> 3.2 先去掉这个弹框
>- 思路1: 既然跳转到App Store,先hook ` - (BOOL)openURL:(NSURL*)url; ` 方法
>- 思路2: 在 UIAlertView 上动手脚
>- 思路3: 实在不行就算了,我不玩了还不行😅😅😅
> 3.3 上面的思路1和思路2都试过了,结果不行,最后还是用Reveal看看吧,看完之后,发现思路2猜对了80%,抖音只是用了UIAlertController,哭晕。。。😭😭😭
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_02.PNG?raw=true)
> 3.4 找对了目标,实现起来就很简单了,直接去掉这个弹框
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_03.PNG?raw=true)
* * *
### 4. 实现自动播放下一个视频
> 4.1 在手机上用FLEXible对抖音的播放界面进行分析,发现播放页面控制器为 ` AWEFeedTableViewController `
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_04.PNG?raw=true)
> 4.2 查看对应头文件
> 4.3 首先映入眼帘的一个属性`@property(nonatomic) _Bool pureMode; ` ,这个就不用过多解释了,程序猿的命名套路,一试便知,果然正确,纯净模式搞定。
> 4.4 观察头文件,与播放下一个相关的方法有以下几个:
>`- (void)didReceiveAutoPlayNotification:(id)arg1; `
>`- (void)playerItemDidReachEnd:(id)arg1; `
> `- (void)transition_performCustomActionForSlideDirection:(unsigned long long)arg1 gestureRecognizer:(id)arg2; `
> `- (long long)currentIndex; `
> 4.5 尝试了上面提到的所有方法,均无果。最后的最后,灵机一动,发现视频播放器为 `AWEAwemePlayVideoViewController` ,那完全可以在这里发送通知,每个视频播放完的时候通知 ` AWEFeedTableViewController ` 播放下一个就可以了。Nice!这个过程很漫长,但在成功的一瞬间确实很有成就感。
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_05.PNG?raw=true)
> 4.6 验证上面的猜想,结果正确,这里用到了上面提到的:`- (long long)currentIndex; ` ,获取当前index,然后播放下一个。
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_06.PNG?raw=true)
> 4.7 感想:方向若是错误,停止就是进步
* * *
### 5. 在设置界面,增加开关按钮,控制是否需要自动播放下一个,因为有时候需要看看评论,重复观看一个视频。
> 5.1 用FLEXible观察设置界面界面布局及其属性,发现设置界面的逻辑关系为:
> - `AWESettingsTableViewController`
> - `AWEGeneralSettingViewModel`
> - `AWESettingSectionModel`
> - `AWESettingItemModel`
> 5.2 `AWESettingsTableViewController`的父类 AWESettingBaseViewController 有一个方法名为: `- (void)refreshView;` 这个方法用来增加设置项最好不过。
> 5.3 这里涉及到一个很重要的知识点,就是快速获取block的参数信息。网上好多资料都是使用 debugserver + lldb 的方法,[参考文章](http://www.swiftyper.com/2016/12/16/debuging-objective-c-blocks-in-lldb/), 这种方法的缺点很明显:计算麻烦,需要配置,容易出错。我在逛论坛是无意间发现了一个更快捷的方法就是通过 `CTObjectiveCRuntimeAdditions` 快速获取block的参数信息。它的原理就是根据LLVM文档,把block重新实现了一遍,然后获取内部参数。
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_07.PNG?raw=true)
> 5.4 通过这种方法,发现`AWESettingItemModel`里的
`@property(copy, nonatomic) CDUnknownBlockType switchChangedBlock;` 参数信息:参数个数为 1, 类型为 BOOL, [参考文档](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html),备注:第0个参数为系统自用,不予考虑。
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_08.PNG?raw=true)
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_09.PNG?raw=true)
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_010.PNG?raw=true)
> 5.5 综上所述,功能实现,效果展示:
> ![](https://github.com/Nododo/HookDouYin/blob/master/IMG/IMG_011.gif?raw=true)
### 6. (https://github.com/Nododo/HookDouYin)
## 总结,引用《暗时间》里的一段话:
### 问题在想通了之后总是简单的,问题的困难程度不在于想通了之后还觉得有多难,而在于从你觉得它难到你觉得它简单需要耗费多少思维体力,你耗费的时间越长,说明有越多的人最终还是没有想明白(路越长走到底的人越少)。 本帖最后由 nododo1027 于 2019-2-14 16:22 编辑
说点题外话,本人是靠混水区升级过的,后来积分规则调整又降级了,于是过年期间憋了这篇文章,大家多多交流,顺便评个分就更好不过了~
很强,赞一个 问题在想通了之后总是简单的,问题的困难程度不在于想通了之后还觉得有多难,而在于从你觉得它难到你觉得它简单需要耗费多少思维体力,你耗费的时间越长,说明有越多的人最终还是没有想明白(路越长走到底的人越少)。 路越长走到底的人越少 看到懒人癌的我自动滚了进来~{:301_997:} 本帖最后由 王小劣 于 2019-2-13 17:31 编辑
很不错,支持楼主.
另外学习到了获取Block 的参数的简便方法 感谢. 虽然看不懂还是要赞一个 。。。。懒到家了 感谢分享 虽然看不懂还是要赞一个 很赞同楼主说的最后一句话,同时也学习了心得思路,感谢