1.目标
由于看直播的时候主播叫我发 666,支持他,我肯定支持他呀,就一直发,可是后来发现太浪费时间了,能不能做一个直播间自动发 666 呢?于是就花了几分钟做了一个。
2.操作环境
越狱iPhone一台
frida
mac
3.流程
下载最新某音App
既然是发送消息,那关键词 sendmessage 则是我们的切入点
..................
详情上一篇,当app 版本在20.7.0做的测试,但升级到最新版以后无法使用了
现在就来升级一下
当时是通过 initWithStore 来初始化,获取对象,发现新版不走这个方法,导致无法使用
- (HTSLiveCommentFragment *)initWithStore:(id)arg1
用 Frida 查看启动流程
frida-trace -UF -m "-[HTSLiveCommentFragment *]"
发现是走的 componentBindService
//new 最新版
7015 ms -[HTSLiveCommentFragment componentBindService]
7387 ms -[HTSLiveCommentFragment componentCreate]
换上代码即可,消息6666 再次回归
- (void)componentBindService{
%orig;//直播不弹出输入法
liveComm = self;
liveCommentFragment = self;
}
%end
消息虽然可以发,但是发现新版已经不走旧的方法了
objectivec-[HTSLiveCommentFragment sendComment:6666666666 commentContext:<IESLiveCommentContext: 0x283bdf640> completion:0x0]
新版是通过 IESLiveCommentContext 对象发送,并不能直接输入文本了。
虽然看到传入了 666666 文本,修改他并不会生效,需修改IESLiveCommentContext对象
具体实现,发送 123456789
objectivec
+(void)sendMsgTest2:(HTSLiveCommentFragment*)lcf
{
IESLiveCommentContext * liveCommentContext = [[NSClassFromString(@"IESLiveCommentContext") alloc] initWithState:0 enterFrom:0 type:0];
[liveCommentContext setPublicScreenID:-1];
[liveCommentContext setPublicScreenType:0x0];
[liveCommentContext setCurrentState:0x1];
[liveCommentContext setDisplayedText:@"666"];
[liveCommentContext setPlainText:@"123456789"];
[lcf sendComment:@"" commentContext:liveCommentContext completion:0x0];
}
首先百度一波
在做饭无法腾出双手,想刷刷抖音,怎么办?
- 懒人癌,抖音自动播放下一个视频
最后发现一篇52文章iOS逆向-如何让某音自动播放下一个视频(懒人癌)https://www.52pojie.cn/thread-865083-1-1.html
我就照着代码搬了下了,显怀激动的打开,然儿并没有反应...........v_v
没办法,那就看看前辈是怎么实现的,应该是版本升级,某些类名发生变化,修复应该很快。
objectivec
//- (void)_addNotifications;
CHOptimizedMethod0(self, void, AWEFeedTableViewController, _addNotifications) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playNext) name:VideoPlayEndedNotiName object:nil];
CHSuper0(AWEFeedTableViewController, _addNotifications);
}
CHDeclareMethod0(void, AWEFeedTableViewController, playNext) {
if ([[NSUserDefaults standardUserDefaults] boolForKey:OpenAutoPlay] == NO) {
return;
}
UITableView *tableView = [self valueForKey:@"_tableView"];
NSIndexPath *path = [NSIndexPath indexPathForRow:self.currentPlayIndex +1 inSection:0];
[tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
CHDeclareClass(AWEVideoPlayerController)
CHOptimizedMethod1(self, void, AWEVideoPlayerController, playerItemDidReachEnd, id, arg1) {
NSLog(@"--------------------------------");
[[NSNotificationCenter defaultCenter] postNotificationName:VideoPlayEndedNotiName object:nil];
CHSuper1(AWEVideoPlayerController, playerItemDidReachEnd, arg1);
}
...................
经过分析,发现前辈是通过 hook 播放页面 _addNotifications方法,注册一个通知。
然后再 hook 视频播放完毕方法 playerItemDidReachEnd ,发送通知到 播放页面,调用系统自带方法切换在一个视频。
好了
既然知道了原理,代码不是生效,那就肯定是 【注册通知】或【视频播放完毕】没有hook 到。
上 frida 一探究竟
frida-trace -UF -m "*[* _addNotifications]"
frida-trace -UF -m "*[* playerItemDidReachEnd]"
运行后发现, 是类名变了,幸好方法名还好使。
objectivec
-[TTVideoEngineOwnPlayer playerItemDidReachEnd]
-[AWEAwemeDetailTableViewController _addNotifications]
替换上以后,完美运行,你也赶快试试吧~
cs
//这里替换好的代码
{
//此处省略一万字
}
总结,引用《暗时间》里的一段话:
让你自己成为一个持续学习和思考的人,并只写你真正思考和总结之后的产物,其他一切就会随之而来。
问题在想通了之后总是简单的,问题的困难程度不在于想通了之后还觉得有多难,而在于从你觉得它难到你觉得它简单需要耗费多少思维体力,你耗费的时间越长,说明有越多的人最终还是没有想明白(路越长走到底的人越少)。
所以,如果你习惯了思考问题,就总会有东西写,先有思考,然后有总结,然后在总结中进一步思考。