此处去以iOS逆向YouTube的app为例,介绍典型的iOS逆向的过程。
此处逆向YouTube的目的暂且定为,尝试搞懂YouTube广告过滤的可能性和底层涉及相关机制。
逆向YouTube过程
下面介绍,如何进行iOS逆向YouTube的过程。
砸壳ipa
在iPhone越狱后,接着去逆向iOS的YouTube。
先准备好砸壳后的ipa。
两种可能=来源:
别人的
【部分解决】下载16.36.4旧版本YouTube的ipa
【未解决】寻找和下载16.36.4或更低版本的YouTube的ipa
别人给的
网上找的
自己砸壳得到的
此处主要介绍后者:
自己从AppStore中安装YouTube,再砸壳出ipa
先去AppStore中安装YouTube
【记录】国行越狱iPhone安装YouTube
【无需解决】国内越狱iPhone如何翻墙上外网使用YouTube
再去砸壳
【已解决】Mac中用frida-ios-dump去砸壳出YouTube的ipa文件
【已解决】frida-ios-dump砸壳YouTube但是无法启动应用
安装ipa到iPhone,确保YouTube正常使用
【已解决】用Filza安装YouTube的ipa确认能正常运行
【已解决】iPhone中查看已安装app的包名
【记录】测试16.44.4旧版YouTube的ipa广告拦截是否也时间重置
说明:动态调试才需要,一般静态分析,不需要
涉及帖子
【未解决】Cydia中安装AppStore++寻找YouTube的16.36.4的旧版本
【未解决】试试CokePokes的原版AppStore++能否安装旧版YouTube
【已解决】安装CokePokes的原版AppStore++
【未解决】用Cydia致尚官方源安装的AppStore++安装旧版YouTube
【未解决】AppStore++用Manual Install Advanced去尝试安装旧版YouTube
【已解决】Cydia中安装应用降级AppStore++插件
TODO:
【记录】class-dump导出头文件:YouTube的动态库二进制Module_Framework
【未解决】class-dump导出YouTube头文件报错:Unknown load command 0x00000032
【已解决】Mac中用class-dump导出YouTube头文件
用class-dump
导出YouTube
的头文件
此处YouTube
有2个二进制:
YouTube
Module_Framework
所以要分别导出对应的头文件。
导出后的效果:
2.7万多个头文件
3800多个头文件
主要涉及,分别用IDA加载和分析,YouTube的2个二进制的文件:
YouTube
Module_Framework
然后分析其代码逻辑。
其中最核心用法是,找到可以的要研究的类的函数后,去Functions
窗口中,通过函数名搜索函数,找到对应汇编代码,再F5
查看反编译后的伪代码,尝试搞懂代码的具体逻辑。
为了更好的,全局去搜一些类、变量、字符串等,用于iOS逆向研究YouTube的逻辑
所以考虑去导出全部的IDA伪代码:
TODO:
【未解决】IDA图形界面GUI模式使用ida-batch_decompile批量导出全部YouTube的Module_Framework全部伪代码
【未解决】用IDA的命令行文本模式使用ida-batch_decompile批量导出全部YouTube的Module_Framework全部伪代码
【未解决】用插件导出IDA的YouTube的Module_Framework的全部反汇编的源码伪代码
【记录】IDA中用idat64的Batch Mode尝试反编译导出全部源代码:试试二进制小点的
【已解决】IDA中用idat64的Batch Mode尝试反编译导出YouTube的Module_Framework全部代码伪代码
动态调试 常会涉及:分析YouTube的界面元素
常用工具:
Reveal
Cycript
TODO:
Reveal
【已解决】Mac中下载和安装Reveal
【已解决】MonkeyDev中如何使用Reveal调试YouTube广告页面元素
【已解决】Reveal报错:The app is linked against an older version of the Reveal library
【记录】通过Reveal查看YouTube广告页面元素
【已解决】Mac中Reveal无法启动
【间接解决】Reveal加载页面始终无法完成无法刷新
【记录】XCode和Reveal配合调试YouTube的广告相关逻辑
【记录】通过Reveal查看页面元素找YouTube广告相关类
【记录】用Reveal查看YouTube跳过广告相关页面的元素和类
TODO:
Cycript
【已解决】用MonkeyDev中Cycript去调试YouTube的UI页面的元素
【记录】Mac中用csrutil关闭SIP
【未解决】install_name_tool
【记录】Cycript输出的YouTube的当前页面的类
【已解决】Mac中运行Cycript报错:dyld Library not loaded libruby.2.0.0.dylib
调试代码逻辑
MonkeyDev调试YouTube的代码逻辑:
TODO:
【记录】恢复自己Mac的iOS逆向开发环境
【已解决】Xcode调试越狱iPhone6中的YouTube
【已解决】XCode+MonkeyDev动态调试YouTube的ipa
【记录】研究YouTube广告拦截导致视频从头播放的原因:XCode+MonkeyDev动态调试
【记录】恢复iOS逆向Xcode调试YouTube的开发环境
期间涉及:写hook代码,加断点调试:
找到一些可疑的,需要调试确认是否被调用到的类,则就是:去写hook代码,加断点,去调试看看是否触发:
如果触发:说明推测和判断是对的
如果没触发:说明推测出错
再去找其他可疑的类,再继续去写hook加断点去调试
涉及的过程大概是:
【未解决】研究iPhone中YouTube的app播放视频中间广告导致从头播放
【已解决】iOS的Theos的Logos的hook代码中获取当前YouTube类YTWatchController的属性值activeVideoID
【记录】XCode的lldb调试YouTube的类:YTWatchController
【已解决】XCode+MonkeyDev动态调试YouTube:让程序停止在出现广告的页面
【基本解决】XCode的lldb中输出YouTube类MDXSession实例的属性值currentVideoID
【记录】给MonkeyDev的YouTube的hook中加上通用log代码
【已解决】XCode的lldb调试输出YouTube类YTWatchController实例的属性值和调用函数
【记录】XCode+MonkeyDev动态调试YouTube:寻找和广告相关的类和逻辑
【记录】XCode中Pause暂停去找YouTube的广告相关的类
【记录】研究YouTube广告逻辑:MDXPlaybackController的didPressSkipAd
【记录】研究YouTube广告逻辑:IDA中搜skipAd
【未解决】YouTube动态调试:写hook代码监控视频播放时间被重置变成0
以及后续换其他思路
【记录】从.googlevideo.com入手找YouTube广告视频相关逻辑
【记录】研究YouTube函数:resetWatchTime
【记录】XCode+MonkeyDev动态调试YouTube:寻找和广告相关的类和逻辑
【未解决】研究YouTube逻辑:找到最初的广告视频请求
【未解决】研究YouTube逻辑:找到最初广告视频请求的响应
【已解决】研究YouTube逻辑:找到带ctier=A的response和error出错的地方
【已解决】研究YouTube逻辑:ctier=A时的 request和response的函数调用顺序
【未解决】研究YouTube逻辑:寻找搞懂广告视频ID获取的大流程
【已解决】研究YouTube逻辑:抓包iOS版YouTube的广告视频ID产生的大流程
对于普通的iOS逆向,就重复上述过程
对于此处,逆向YouTube来说,具体是:
静态分析
staticAnalysis
YouTube_17.08.2_headers
header_ModuleFramework
headers_YouTube
研究和搜索头文件中的类,找出可疑的类
研究导出的字符串等资源中,是否有我们要的内容
staticAnalysis
└── YouTube_17.08.2
├── Module_Framework
│ ├── Module_Framework_nm.txt
│ ├── Module_Framework_otool_l.txt
│ ├── Module_Framework_otool_oV.txt
│ └── Module_Framework_strings.txt
├── YouTube
│ ├── YouTube_nm.txt
│ ├── YouTube_otool_l.txt
│ ├── YouTube_otool_oV.txt
动态调试
加过滤条件
log太多了,如何优化减少log
过滤出我们所关心的类,比如initplayback,videoplayback等url
https://xxx.googlevideo.com/initplayback?xxx
https://xxx.googlevideo.com/videoplayback?xxx
比如找到了http
的request
和response
的类,还要继续加过滤条件
【已解决】研究YouTube逻辑:log日志打印优化每隔几次才输出
TODO:
针对可疑的类和函数,写hook代码,加断点调试
从界面元素入手,找到对应的类或父类
作为后续深入研究的切入点:找类的相关头文件
分析界面元素
调试代码逻辑
期间涉及
为了动态调试 常会涉及:恢复符号表
TODO:
【已解决】restore-symbol恢复YouTube的Block符号表报错:Address not found in the image
【记录】YouTube恢复符号表后Xcode调试效果
【已解决】给YouTube恢复符号表方便Xcode调试
【记录】YouTube恢复符号表恢复出部分无效的symbol符号
期间涉及:iOS的app的抓包:
TODO:
【已解决】Mac用Charles抓包iPhone中YouTube视频过滤广告导致从头播放的数据包
TODO:
网络请求
【整理】YouTube广告拦截从头播放视频:相关的网络请求和大概逻辑
网络协议
【整理】YouTube相关:QUIC协议和源码
【整理】Cronet相关源码和定义和具体实现
【已解决】YouTube中struct Cronet_UrlRequestCallback的具体定义实现
【已解决】iOS的YouTube中Cronet_UrlRequestCallback的OnFailed中cronet=10和quic协议关系
Cronet
QUIC
【整理】YouTube涉及到的Network、quic等Chromium相关源码
【整理】YouTube涉及到Chromium中Cronet相关源码和文档
YouTube视频格式
【整理】YouTube中视频相关信息:ISO Media file produced by Google Inc
【未解决】YouTube的response的data视频格式:ftyp=dash
【整理】YouTube逻辑:视频流格式代码
HTTP协议
【已解决】研究YouTube视频内容请求:Transfer-Encoding chunked
【整理】YouTube中Module_Framework函数对应关系 20220804
YouTube广告过滤规则
【记录】研究YouTube逻辑:验证最新圈X的规则能否拦截广告
【记录】pico中使用圈X最新规则的YouTube广告拦截效果
圈X
【记录】测试最新版过滤规则的iOS的YouTube的app中广告过滤效果
调试相关
【记录】Xcode+MonkeyDev动态调试YouTube:广告页面相关类
【记录】调试YouTube广告页面:调试相关数据
内部很多类的具体实现
SRLRegistry_sharedInstance.coffee
(lldb) po 0x00000002839803c0
<SRLRegistry: 0x2839803c0>
Single bindings:
{
"ELMByteStore_API" = "SRLImplementation<0x283690d50, instanceType: ELMByteStore, lifetime: 0, scopeType: 0, configuration: None>";
"ELMJSModuleCache_API" = "SRLImplementation<0x2837f7d80, instanceType: ELMJSModuleCache, lifetime: 0, scopeType: 0, configuration: None>";
"ELMResourceLoader_API" = "SRLImplementation<0x283710a50, instanceType: ELMResourceLoader, lifetime: 0, scopeType: 0, configuration: None>";
"ELMRuntimeConfigFactory_API" = "SRLImplementation<0x283762f40, instanceType: YTELMRuntimeConfigFactory, lifetime: 0, scopeType: 0, configuration: None>";
"ELMStore_API" = "SRLImplementation<0x283690cf0, instanceType: YTELMStore, lifetime: 0, scopeType: 0, configuration: None>";
"GHKY2021BugfixesService_API" = "SRLImplementation<0x28363c990, instanceType: GHKY2021Bugfixes, lifetime: 0, scopeType: 0, configuration: None>";
"GIKAccountDeletionWipeoutManager_API" = "SRLImplementation<0x2837c9650, instanceType: GIKAccountDeletionWipeoutManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"GIKAccountSourceService_API" = "SRLImplementation<0x28376ca50, instanceType: GIKAccountSourceServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
"GIKSSOAccountSourceService_API" = "SRLImplementation<0x28376cae0, instanceType: GIKSSOAccountSourceServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
"GIKSSOBridgeService_API" = "SRLImplementation<0x28376cb10, instanceType: GIKSSOBridgeServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
"GIKSharedLibraryService_API" = "SRLImplementation<0x28376ca80, instanceType: GIKSharedLibraryServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
"HAMClock_API" = "SRLImplementation<0x283651f20, instanceType: HAMSystemClock, lifetime: 0, scopeType: 0, configuration: None>";
"HAMDataLoadTaskObserver_API" = "SRLImplementation<0x2834811a0, instanceType: MLHAMDataLoadTaskObserverImpl, lifetime: 0, scopeType: 0, configuration: None>";
"HAMIdleTimer_API" = "SRLImplementation<0x2834a3420, instanceType: HAMIdleTimerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"HAMSystemNotifications_API" = "SRLImplementation<0x2834b3960, instanceType: YTSystemNotifications, lifetime: 0, scopeType: 0, configuration: None>";
"IGDManager_API" = "SRLImplementation<0x283698030, instanceType: IGDManager, lifetime: 0, scopeType: 0, configuration: None>";
"MDXConfig_API" = "SRLImplementation<0x283763660, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"MDXServices_API" = "SRLImplementation<0x283763810, instanceType: MDXRealServices, lifetime: 0, scopeType: 0, configuration: None>";
"MLAVAssetDownloader_API" = "SRLImplementation<0x2836f2f70, instanceType: MLAVAssetDownloader, lifetime: 0, scopeType: 0, configuration: None>";
"MLAudioSession_API" = "SRLImplementation<0x2834846c0, instanceType: MLAudioSession, lifetime: 0, scopeType: 0, configuration: None>";
"MLCDM_API" = "SRLImplementation<0x2834a5e30, instanceType: MLWidevineCDMImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLCacheProvider_API" = "SRLImplementation<0x2834b2460, instanceType: MLDefaultCacheProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLCaptionConfig_API" = "SRLImplementation<0x2834a9aa0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"MLCaptionControllerFactory_API" = "SRLImplementation<0x2834a7d80, instanceType: MLDefaultCaptionControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"MLCaptionDisplayControllerFactory_API" = "SRLImplementation<0x2834a39f0, instanceType: YTGLCaptionDisplayControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"MLCaptionDisplaySettingsProvider_API" = "SRLImplementation<0x2834ac4e0, instanceType: MLDefaultCaptionDisplaySettingsProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLCaptionService_API" = "SRLImplementation<0x283682100, instanceType: MLDefaultCaptionService, lifetime: 0, scopeType: 0, configuration: None>";
"MLClientInfoFiller_API" = "SRLImplementation<0x28348a190, instanceType: MLClientInfoFillerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLClockOffsetEstimator_API" = "SRLImplementation<0x2834b1440, instanceType: MLClockOffsetEstimator, lifetime: 0, scopeType: 0, configuration: None>";
"MLDataPlanController_API" = "SRLImplementation<0x2836098f0, instanceType: MLDataPlanController, lifetime: 0, scopeType: 0, configuration: None>";
"MLDefaultViewportSizeProvider_API" = "SRLImplementation<0x283482e50, instanceType: MLSingletonViewportSizeProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLHAMAudioEngineProvider_API" = "SRLImplementation<0x283487690, instanceType: MLHAMAudioEngineProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLHAMDataLoaderProvider_API" = "SRLImplementation<0x283608f90, instanceType: MLHAMDataLoaderProviderImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLInitialFormatSelectionConfig_API" = "SRLImplementation<0x28348a0d0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"MLInnerTubeContextDecorator_API" = "SRLImplementation<0x28360a400, instanceType: MLInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>";
"MLLocalAVAssetBundleManager_API" = "SRLImplementation<0x2836f2df0, instanceType: MLLocalAVAssetBundleManager, lifetime: 0, scopeType: 0, configuration: None>";
"MLMediaCapabilitiesProvider_API" = "SRLImplementation<0x28348a100, instanceType: MLMediaCapabilitiesProviderImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLNetworkStatsProvider_API" = "SRLImplementation<0x2835627f0, instanceType: MLNetworkStatsProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLOfflineRepoFactory_API" = "SRLImplementation<0x2836f2ee0, instanceType: YTOfflineRepoFactory, lifetime: 0, scopeType: 0, configuration: None>";
"MLOfflineTracklistCaptionProvider_API" = "SRLImplementation<0x2834a9ad0, instanceType: YTOfflineVideoCaptionsProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLOfflineVideoDownloadController_API" = "SRLImplementation<0x2836f33f0, instanceType: MLOfflineVideoDownloadControllerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLOnesieDataSaverConfig_API" = "SRLImplementation<0x283562910, instanceType: MLOnesieDataSaverConfigImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLOnesieFetcherService_API" = "SRLImplementation<0x2834b1560, instanceType: MLOnesieFetcherService, lifetime: 0, scopeType: 0, configuration: None>";
"MLOnesieHostProvider_API" = "SRLImplementation<0x283561380, instanceType: MLOnesieHostProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLOnesieRequestFactory_API" = "SRLImplementation<0x2834b2e50, instanceType: MLOnesieRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
"MLOnesieVideoDataProvider_API" = "SRLImplementation<0x2834a69a0, instanceType: MLOnesieVideoDataProvider, lifetime: 0, scopeType: 0, configuration: None>";
"MLPIPController_API" = "SRLImplementation<0x2835657a0, instanceType: MLPIPController, lifetime: 0, scopeType: 0, configuration: None>";
"MLPlayerPool_API" = "SRLImplementation<0x283483a80, instanceType: MLPlayerPoolImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLPlayerViewFactory_API" = "SRLImplementation<0x283483ab0, instanceType: YTGLMediaPlayerViewFactory, lifetime: 0, scopeType: 0, configuration: None>";
"MLScreenCapturedStatus_API" = "SRLImplementation<0x2834a3630, instanceType: MLScreenCapturedStatusImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLStreamStoreConfig_API" = "SRLImplementation<0x283483b10, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"MLStreamStore_API" = "SRLImplementation<0x283483ae0, instanceType: MLStreamStore, lifetime: 0, scopeType: 0, configuration: None>";
"MLTFLiteModelService_API" = "SRLImplementation<0x28360a8e0, instanceType: MLTFLiteModelService, lifetime: 0, scopeType: 0, configuration: None>";
"MLTFLiteNetworkModel_API" = "SRLImplementation<0x283562700, instanceType: MLTFLiteNetworkModel, lifetime: 0, scopeType: 0, configuration: None>";
"MLUserFeatures_API" = "SRLImplementation<0x2834b2df0, instanceType: MLUserFeaturesImpl, lifetime: 0, scopeType: 0, configuration: None>";
"MLVideoDownloadTaskDelegate_API" = "SRLImplementation<0x2836f2e20, instanceType: MLVideoDownloaderMediaDownloaderShim, lifetime: 0, scopeType: 0, configuration: None>";
"MLVideoDownloaderDelegate_API" = "SRLImplementation<0x2836f2c40, instanceType: MLVideoDownloaderMediaDownloaderShim, lifetime: 0, scopeType: 0, configuration: None>";
"MLVideoDownloaderMediaDownloaderShim_API" = "SRLImplementation<0x2836f2e50, instanceType: MLVideoDownloaderMediaDownloaderShim, lifetime: 0, scopeType: 0, configuration: None>";
"MLVideoDownloader_API" = "SRLImplementation<0x2836f2d90, instanceType: MLVideoDownloader, lifetime: 0, scopeType: 0, configuration: None>";
"PHTPhenotypeFlagsRegistryService_API" = "SRLImplementation<0x28363c9c0, instanceType: PHTPhenotypeFlagsRegistry, lifetime: 0, scopeType: 0, configuration: None>";
"RCHServiceConfigurationProvider_API" = "SRLImplementation<0x283682af0, instanceType: YTRCHServiceConfigurationProvider, lifetime: 0, scopeType: 0, configuration: None>";
"RCHService_API" = "SRLImplementation<0x283682ac0, instanceType: RCHServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
"SSOConfigurationProvider_API" = "SRLImplementation<0x2837c9e60, instanceType: YTSSOServiceFactory, lifetime: 0, scopeType: 0, configuration: None>";
"SSOServiceContainer_API" = "SRLImplementation<0x28376d200, instanceType: SSOServiceContainerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"SSOService_API" = "SRLImplementation<0x2837c9e90, instanceType: SSOService, lifetime: 0, scopeType: 0, configuration: None>";
"YTAccountLinkingMenuVisibilityHandler_API" = "SRLImplementation<0x282b9b7e0, instanceType: YTAccountLinkingMenuVisibilityHandler, lifetime: 0, scopeType: 0, configuration: None>";
"YTAccountScopedCommandRegistrar_API" = "SRLImplementation<0x283574600, instanceType: YTAccountScopedCommandRegistrar, lifetime: 0, scopeType: 1, configuration: None>";
"YTAccountScopedCommandRouter_API" = "SRLImplementation<0x2835725b0, instanceType: YTAccountScopedCommandRouter, lifetime: 0, scopeType: 1, configuration: None>";
"YTAccountScopedInnerTubeContextFactory_API" = "SRLImplementation<0x2834e9410, instanceType: YTAccountScopedInnerTubeContextFactory, lifetime: 0, scopeType: 1, configuration: None>";
"YTAccountScopedInnerTubeRequestFactory_API" = "SRLImplementation<0x2834e91d0, instanceType: YTAccountScopedInnerTubeRequestFactory, lifetime: 0, scopeType: 1, configuration: None>";
"YTAccountScopedInnerTubeRequestorFactory_API" = "SRLImplementation<0x2834e9260, instanceType: YTAccountScopedInnerTubeRequestorFactory, lifetime: 0, scopeType: 1, configuration: None>";
"YTAccountScopedInnerTubeResponseCache_API" = "SRLImplementation<0x2834e91a0, instanceType: YTAccountScopedInnerTubeResponseCache, lifetime: 0, scopeType: 1, configuration: None>";
"YTAccountScopedInnerTubeStackConfiguration_API" = "SRLImplementation<0x2834e92f0, instanceType: YTAccountScopedInnerTubeStackConfiguration, lifetime: 0, scopeType: 0, configuration: None>";
"YTAccountScopedVisitorDataRequestDecorator_API" = "SRLImplementation<0x2834e9230, instanceType: YTAccountScopedVisitorDataRequestDecorator, lifetime: 0, scopeType: 1, configuration: None>";
"YTActiveStateDescriptorSubControllerFactoryProtocol_API" = "SRLImplementation<0x28360b3c0, instanceType: YTCoreActiveStateDescriptorSubControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTActiveVideoNotifier_API" = "SRLImplementation<0x28376a160, instanceType: YTActiveVideoNotifier, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdBreakFetcherAPI_API" = "SRLImplementation<0x282bbb0f0, instanceType: YTAdBreakRendererFetcher, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdCuepointAPI_API" = "SRLImplementation<0x2834879f0, instanceType: YTAdCuepointEventCenter, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdElementsCellAPIImpl_API" = "SRLImplementation<0x2837014d0, instanceType: YTAdElementsCellAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdElementsCellExternallyManagedSlotAdapter_API" = "SRLImplementation<0x28362a040, instanceType: YTAdElementsCellExternallyManagedSlotAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdInnerTubeConfig_API" = "SRLImplementation<0x283711680, instanceType: YTRealAdInnerTubeConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdInterruptAPI_API" = "SRLImplementation<0x282b88240, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdIntervalManagerTriggerAdapter_API" = "SRLImplementation<0x282b887e0, instanceType: YTAdIntervalManagerTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdIntervalManager_API" = "SRLImplementation<0x282bb8390, instanceType: YTAdIntervalManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdLoggingAPI_API" = "SRLImplementation<0x2834ae5b0, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdMacroExpanderProvider_API" = "SRLImplementation<0x283650570, instanceType: YTAdMacroExpanderProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsControlFlowEventTriggerAdapter_API" = "SRLImplementation<0x28349be40, instanceType: YTAdsControlFlowEventTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsControlFlowIDGenerator_API" = "SRLImplementation<0x28362a010, instanceType: YTAdsControlFlowIDGeneratorImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsControlFlowManager_API" = "SRLImplementation<0x283487600, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsControlFlowObservable_API" = "SRLImplementation<0x28349a2e0, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsControlFlowOpportunityReceivedCommandAPIListener_API" = "SRLImplementation<0x283629ec0, instanceType: YTCommandDrivenExternallyManagedSlotOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsControlFlowOpportunityReceivedCommandHandler_API" = "SRLImplementation<0x2836299e0, instanceType: YTAdsControlFlowOpportunityReceivedCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
"YTAdsEventLoggingController_API" = "SRLImplementation<0x283629f20, instanceType: YTAdsEventLoggingControllerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsFrequencyCapProtocol_API" = "SRLImplementation<0x2834b0db0, instanceType: YTFrequencyCapTracker, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsPlaybackService_API" = "SRLImplementation<0x2834a2e50, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsPlayerServices_API" = "SRLImplementation<0x2834963a0, instanceType: YTRealAdsPlayerServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTAdsSKOverlayService_API" = "SRLImplementation<0x28348f0f0, instanceType: YTAdsMainAppSKOverlayServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTAgeCapabilitiesService_API" = "SRLImplementation<0x283763510, instanceType: YTAgeCapabilitiesServiceImpl, lifetime: 0, scopeType: 4, configuration: None>";
"YTAppBrowseSwipeLeftCommandProvider_API" = "SRLImplementation<0x2836bf300, instanceType: YTReelCameraCommandCache, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppConfig_API" = "SRLImplementation<0x28357f1e0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppFlowStateController_API" = "SRLImplementation<0x283681920, instanceType: YTAppFlowStateController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppHomeElementsRegistry_API" = "SRLImplementation<0x2836ea0a0, instanceType: YTAppHomeElementsRegistry, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppMealbarPromoController_API" = "SRLImplementation<0x28369df20, instanceType: YTAppMealbarPromoController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppOfflineContentRepairController_API" = "SRLImplementation<0x2836fd380, instanceType: YTAppOfflineContentRepairController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppOfflineResumeController_API" = "SRLImplementation<0x28349e340, instanceType: YTAppOfflineResumeController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppOfflineResumeSyncController_API" = "SRLImplementation<0x28349e4f0, instanceType: YTAppOfflineResumeSyncController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppOfflineVideoController_API" = "SRLImplementation<0x283480840, instanceType: YTAppOfflineVideoController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppSettingsStore_API" = "SRLImplementation<0x2836feb80, instanceType: YTAppSettingsStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppStartupInstrumentationTransmitter_API" = "SRLImplementation<0x28356f0c0, instanceType: YTGELCSITransmitter, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppStartupReasonController_API" = "SRLImplementation<0x283689680, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTAppThemeSettingPromoController_API" = "SRLImplementation<0x2836cc600, instanceType: YTAppThemeSettingPromoController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppTransactionQueueController_API" = "SRLImplementation<0x28369e0d0, instanceType: YTAppTransactionQueueController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppUserDefaultsMigrator_API" = "SRLImplementation<0x283481c50, instanceType: YTAppUserDefaultsMigrator, lifetime: 0, scopeType: 0, configuration: None>";
"YTAppViewController_API" = "SRLImplementation<0x283690c60, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
"YTAttestationChallengeService_API" = "SRLImplementation<0x283763570, instanceType: YTAttestationChallengeService, lifetime: 0, scopeType: 0, configuration: None>";
"YTAudioSession_API" = "SRLImplementation<0x2837cb660, instanceType: MLAudioSession, lifetime: 0, scopeType: 0, configuration: None>";
"YTBackAsStackManager_API" = "SRLImplementation<0x283698660, instanceType: YTBackAsStackManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTBackgroundTasksController_API" = "SRLImplementation<0x2836cadc0, instanceType: YTAppBackgroundTasksController, lifetime: 0, scopeType: 0, configuration: None>";
"YTBackgroundabilityPolicy_API" = "SRLImplementation<0x2834849c0, instanceType: YTBackgroundabilityPolicy, lifetime: 0, scopeType: 0, configuration: None>";
"YTBedtimeReminderController_API" = "SRLImplementation<0x2836ad6e0, instanceType: YTBedtimeReminderController, lifetime: 0, scopeType: 0, configuration: None>";
"YTBelowPlayerCompanionRenderingAPIImpl_API" = "SRLImplementation<0x2828ad500, instanceType: YTBelowPlayerCompanionRenderingAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTBelowPlayerImmersiveRenderingAPIImpl_API" = "SRLImplementation<0x2828ad530, instanceType: YTBelowPlayerImmersiveRenderingAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTBelowPlayerImmersiveSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x282bcc450, instanceType: YTBelowPlayerImmersiveSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTBelowPlayerSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x282bcc2a0, instanceType: YTBelowPlayerSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTBlobStorageBlocking_API" = "SRLImplementation<0x2836b23a0, instanceType: YTPINDiskCacheBlobStorage, lifetime: 0, scopeType: 0, configuration: None>";
"YTBlobStorage_API" = "SRLImplementation<0x28360a340, instanceType: YTPINDiskCacheBlobStorage, lifetime: 0, scopeType: 0, configuration: None>";
"YTBrowseService_API" = "SRLImplementation<0x283714000, instanceType: YTAppBrowseService, lifetime: 0, scopeType: 4, configuration: None>";
"YTCTTelephonyNetworkInfo_API" = "SRLImplementation<0x2837f8690, instanceType: YTCTTelephonyNetworkInfoImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTCastSessionController_API" = "SRLImplementation<0x282b9af10, instanceType: YTNoOpCastSessionController, lifetime: 0, scopeType: 0, configuration: None>";
"YTCellFactory_API" = "SRLImplementation<0x28361f030, instanceType: YTInnerTubeCellFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTClearcutController_API" = "SRLImplementation<0x2837c8930, instanceType: YTClearcutController, lifetime: 0, scopeType: 0, configuration: None>";
"YTClientEnvironment_API" = "SRLImplementation<0x2834ab090, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTClientEventIdController_API" = "SRLImplementation<0x2837fce10, instanceType: YTClientEventIdController, lifetime: 0, scopeType: 0, configuration: None>";
"YTClipController_API" = "SRLImplementation<0x282b82070, instanceType: YTClipController, lifetime: 0, scopeType: 0, configuration: None>";
"YTClipsElementsRegistry_API" = "SRLImplementation<0x282b820d0, instanceType: YTClipsElementsRegistry, lifetime: 0, scopeType: 0, configuration: None>";
"YTClockEntityTransformationTrigger_API" = "SRLImplementation<0x2836f1fb0, instanceType: YTClockEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>";
"YTColdConfig_API" = "SRLImplementation<0x28379b5a0, instanceType: YTColdConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTCollectionScrollTrackerSamplerGate_API" = "SRLImplementation<0x2836c6e50, instanceType: YTCollectionScrollTrackerSamplerGate, lifetime: 0, scopeType: 0, configuration: None>";
"YTColorStyle_API" = "SRLImplementation<0x283767570, instanceType: YTAppColorStyle, lifetime: 0, scopeType: 0, configuration: None>";
"YTCommandRegistrar_API" = "SRLImplementation<0x283681b60, instanceType: YTCommandRegistrar, lifetime: 0, scopeType: 0, configuration: None>";
"YTCommandRouter_API" = "SRLImplementation<0x283763630, instanceType: YTCommandRouter, lifetime: 0, scopeType: 0, configuration: None>";
"YTCompanionAdSectionControllerProvider_API" = "SRLImplementation<0x282bfaa60, instanceType: YTCompanionAdSectionControllerProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTConfigService_API" = "SRLImplementation<0x28357edf0, instanceType: YTConfigService, lifetime: 0, scopeType: 0, configuration: None>";
"YTConnectionStatusController_API" = "SRLImplementation<0x283698930, instanceType: YTConnectionStatusController, lifetime: 0, scopeType: 0, configuration: None>";
"YTConsistencyTokenJarVolatileCache_API" = "SRLImplementation<0x283714240, instanceType: YTConsistencyTokenJarVolatileCache, lifetime: 0, scopeType: 0, configuration: None>";
"YTContentPlaybackInfoAPI_API" = "SRLImplementation<0x283487ab0, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
"YTContentVideoPlayerResponseSlotOpportunityAdapter_API" = "SRLImplementation<0x283487c30, instanceType: YTContentVideoPlayerResponseSlotOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTCoreDataDelayedEventQueue_API" = "SRLImplementation<0x2837ef630, instanceType: YTCoreDataDelayedEventQueue, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashConfig_API" = "SRLImplementation<0x283689500, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashContextController_API" = "SRLImplementation<0x283689560, instanceType: YTCrashContextController, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashContextProtocol_API" = "SRLImplementation<0x2837fcba0, instanceType: YTCrashContextController, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashControllerDelegate_API" = "SRLImplementation<0x2836895c0, instanceType: YTCrashCountController, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashController_API" = "SRLImplementation<0x2836894a0, instanceType: YTCrashController, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashRestoreVideoControllerConfig_API" = "SRLImplementation<0x2836842a0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTCrashRestoreVideoController_API" = "SRLImplementation<0x283684270, instanceType: YTCrashRestoreVideoController, lifetime: 0, scopeType: 0, configuration: None>";
"YTCuepointOpportunityAdapter_API" = "SRLImplementation<0x283487960, instanceType: YTCuepointOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTDAIAdsPlaybackLifecycleAPI_API" = "SRLImplementation<0x283487b40, instanceType: YTDAIAdsPlaybackLifecycleController, lifetime: 0, scopeType: 0, configuration: None>";
"YTDAIContentPlaybackLifecycleAPI_API" = "SRLImplementation<0x283487840, instanceType: YTDAIContentPlaybackLifecycleController, lifetime: 0, scopeType: 0, configuration: None>";
"YTDAIContentPlaybackStatusAPI_API" = "SRLImplementation<0x283487a80, instanceType: YTDAIContentPlaybackStatusController, lifetime: 0, scopeType: 0, configuration: None>";
"YTDataFetcherService_API" = "SRLImplementation<0x2837f00c0, instanceType: YTDataFetcherService, lifetime: 0, scopeType: 0, configuration: None>";
"YTDataOperationQueue_API" = "SRLImplementation<0x2837fc7e0, instanceType: YTInnerTubeOperationQueue, lifetime: 0, scopeType: 0, configuration: None>";
"YTDataServices_API" = "SRLImplementation<0x283694090, instanceType: YTRealDataServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTDefaultPlayerOverlayFactory_API" = "SRLImplementation<0x2834966d0, instanceType: YTDefaultPlayerOverlayFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTDefaultSlotAdapterFactory_API" = "SRLImplementation<0x2834a6430, instanceType: YTDefaultSlotAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTDeferredAtrController_API" = "SRLImplementation<0x2836fd470, instanceType: YTDeferredAtrController, lifetime: 0, scopeType: 0, configuration: None>";
"YTDeferredAtrDataStore_API" = "SRLImplementation<0x2836fd650, instanceType: YTDeferredAtrDataStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTDelayedEventEntityStore_API" = "SRLImplementation<0x2837ef6f0, instanceType: YTDelayedEventEntityStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTDeviceClassificationURLDecorator_API" = "SRLImplementation<0x2837fc810, instanceType: YTDeviceClassificationURLDecorator, lifetime: 0, scopeType: 0, configuration: None>";
"YTDiscoveryPlaybackTrackerLayoutEnteredOpportunityAdapter_API" = "SRLImplementation<0x28349a3d0, instanceType: YTDiscoveryPlaybackTrackerLayoutEnteredOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTECatcherController_API" = "SRLImplementation<0x2837fc7b0, instanceType: YTECatcherController, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMEntitiesProcessorRegistrar_API" = "SRLImplementation<0x283573420, instanceType: YTELMEntitiesProcessorRegistrar, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMFontLoader_API" = "SRLImplementation<0x283579080, instanceType: YTELMFontLoader, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMJSEnvironment_API" = "SRLImplementation<0x283710840, instanceType: YTELMJSEnvironment, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMPerformanceAgentFactory_API" = "SRLImplementation<0x283710810, instanceType: YTELMPerformanceAgentFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMQueryEngineProvider_API" = "SRLImplementation<0x283573450, instanceType: YTELMQueryEngineProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMRegistry_API" = "SRLImplementation<0x2835728e0, instanceType: YTELMRegistry, lifetime: 0, scopeType: 0, configuration: None>";
"YTELMResourceLoader_API" = "SRLImplementation<0x283491170, instanceType: YTELMResourceLoader, lifetime: 0, scopeType: 0, configuration: None>";
"YTEditEffectAssetManager_API" = "SRLImplementation<0x28357f2a0, instanceType: YTEditEffectAssetManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTEditEffectAssetStore_API" = "SRLImplementation<0x28357f270, instanceType: YTEditEffectAssetStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTElementsCommandHandler_API" = "SRLImplementation<0x282b983c0, instanceType: YTElementsCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
"YTElementsContextFactory_API" = "SRLImplementation<0x2835728b0, instanceType: YTELMContextFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTElementsDispatcherFactory_API" = "SRLImplementation<0x283573240, instanceType: YTELMDispatcherFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTElementsLoggerFactory_API" = "SRLImplementation<0x283573270, instanceType: YTELMLoggerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTElementsUpdateHandler_API" = "SRLImplementation<0x283710180, instanceType: YTElementUpdateHandler, lifetime: 0, scopeType: 0, configuration: None>";
"YTEngagementPanelControllerProvider_API" = "SRLImplementation<0x282bd0930, instanceType: YTEngagementPanelControllerProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTEntitiesConfig_API" = "SRLImplementation<0x283718a20, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTEntityTransformationController_API" = "SRLImplementation<0x28361ad30, instanceType: YTEntityTransformationController, lifetime: 0, scopeType: 0, configuration: None>";
"YTEntityTransformationMissingEntityObserver_API" = "SRLImplementation<0x283603720, instanceType: YTEntityTransformationMissingEntityObserver, lifetime: 0, scopeType: 0, configuration: None>";
"YTEventLogger_API" = "SRLImplementation<0x2837cb1b0, instanceType: YTEventLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTEventLoggingController_API" = "SRLImplementation<0x283713600, instanceType: YTEventLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTEventLoggingDelayedEventController_API" = "SRLImplementation<0x2837ef5d0, instanceType: YTEventLoggingDelayedEventController, lifetime: 0, scopeType: 0, configuration: None>";
"YTEventLoggingRetryController_API" = "SRLImplementation<0x2837fce70, instanceType: YTEventLoggingRetryController, lifetime: 0, scopeType: 0, configuration: None>";
"YTEventLoggingRetryDelayedEventController_API" = "SRLImplementation<0x283762d00, instanceType: YTEventLoggingRetryDelayedEventController, lifetime: 0, scopeType: 0, configuration: None>";
"YTEventLoggingService_API" = "SRLImplementation<0x2837fc1b0, instanceType: YTEventLoggingService, lifetime: 0, scopeType: 0, configuration: None>";
"YTExternallyManagedSlotAdapterDelegate_API" = "SRLImplementation<0x283487c00, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTFeatureGatesClient_API" = "SRLImplementation<0x283763750, instanceType: YTFeatureGatesClient, lifetime: 0, scopeType: 4, configuration: None>";
"YTFeedFilterChipBarControllerConfig_API" = "SRLImplementation<0x2836703c0, instanceType: YTFeedFilterChipBarController, lifetime: 0, scopeType: 0, configuration: None>";
"YTFeedbackCoordinator_API" = "SRLImplementation<0x28369f600, instanceType: YTFeedbackCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTFetcherConfig_API" = "SRLImplementation<0x2837cb3f0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTFlatFileLogsReader_API" = "SRLImplementation<0x2836aac40, instanceType: YTFlatFileLogsReader, lifetime: 0, scopeType: 0, configuration: None>";
"YTFrequencyCapTracker_API" = "SRLImplementation<0x2834949f0, instanceType: YTFrequencyCapTracker, lifetime: 0, scopeType: 0, configuration: None>";
"YTFulfillmentAdapterDelegate_API" = "SRLImplementation<0x2834a64c0, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTFulfillmentAdapterFactoryManager_API" = "SRLImplementation<0x28349b630, instanceType: YTFulfillmentAdapterFactoryManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTFullscreenEngagementCompanionLayoutRenderingAdapterFactory_API" = "SRLImplementation<0x282b87c30, instanceType: YTFullscreenEngagementCompanionLayoutRenderingAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTGELStreamzService_API" = "SRLImplementation<0x283682b20, instanceType: YTGELStreamzService, lifetime: 0, scopeType: 0, configuration: None>";
"YTGLCardboardRenderer_API" = "SRLImplementation<0x283483870, instanceType: YTGLCardboardRenderer, lifetime: 0, scopeType: 0, configuration: None>";
"YTGLMediaPlayerViewFactory_API" = "SRLImplementation<0x283483a20, instanceType: YTGLMediaPlayerViewFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTGLSceneProtocol_API" = "SRLImplementation<0x283484a20, instanceType: YTGLScene, lifetime: 0, scopeType: 0, configuration: None>";
"YTGaiaIdentityService_API" = "SRLImplementation<0x2837c8ea0, instanceType: YTGaiaIdentityService, lifetime: 0, scopeType: 0, configuration: None>";
"YTGetLocationCommandHandlerClassObservable_API" = "SRLImplementation<0x282bb8ed0, instanceType: YTGetLocationCommandHandlerClassObservable, lifetime: 0, scopeType: 0, configuration: None>";
"YTGlobalConfig_API" = "SRLImplementation<0x28379b7b0, instanceType: YTGlobalConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTGlobalConfigsApplier_API" = "SRLImplementation<0x2837fc780, instanceType: YTGlobalConfigsApplier, lifetime: 0, scopeType: 0, configuration: None>";
"YTGoogleConversionPingConfig_API" = "SRLImplementation<0x2836cc4e0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTGuideServiceCoordinator_API" = "SRLImplementation<0x283692190, instanceType: YTAppGuideServiceCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTGuideService_API" = "SRLImplementation<0x2836921c0, instanceType: YTGuideService, lifetime: 0, scopeType: 0, configuration: None>";
"YTHeaderLogoController_API" = "SRLImplementation<0x2836c6490, instanceType: YTHeaderLogoController, lifetime: 0, scopeType: 0, configuration: None>";
"YTHeartbeatService_API" = "SRLImplementation<0x2834adfe0, instanceType: YTHeartbeatService, lifetime: 0, scopeType: 0, configuration: None>";
"YTHintController_API" = "SRLImplementation<0x2836a4060, instanceType: YTHintController, lifetime: 0, scopeType: 0, configuration: None>";
"YTHintsConfig_API" = "SRLImplementation<0x2836a4090, instanceType: YTAppHintsConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTHomeFeedGlobalMonitor_API" = "SRLImplementation<0x28360b3f0, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
"YTHomeOfflineController_API" = "SRLImplementation<0x28368cab0, instanceType: YTHomeOfflineController, lifetime: 0, scopeType: 0, configuration: None>";
"YTHotConfig_API" = "SRLImplementation<0x2837a5140, instanceType: YTHotConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTIOSGuardSnapshotController_API" = "SRLImplementation<0x283704150, instanceType: YTIOSGuardSnapshotController, lifetime: 0, scopeType: 0, configuration: None>";
"YTIdentityController_API" = "SRLImplementation<0x2837f7c30, instanceType: YTIdentityController, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityEntityTransformer_API" = "SRLImplementation<0x28361a430, instanceType: YTIdentityEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>";
"YTIdentityNotifier_API" = "SRLImplementation<0x2837c9890, instanceType: YTIdentityNotifier, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityProvider_API" = "SRLImplementation<0x2837c9830, instanceType: YTIdentityController, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityRestorer_API" = "SRLImplementation<0x2837c9590, instanceType: YTIdentityRestorer, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityRetriever_API" = "SRLImplementation<0x2837c9560, instanceType: YTIdentityRetriever, lifetime: 0, scopeType: 0, configuration: None>";
"YTIdentityScopedPersistentEntityStoreProvider_API" = "SRLImplementation<0x2837130f0, instanceType: YTIdentityScopedPersistentEntityStoreProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTIdentityScopedPersistentEntityStore_API" = "SRLImplementation<0x283718a50, instanceType: YTIdentityScopedPersistentEntityStoreV2, lifetime: 0, scopeType: 1, configuration: None>";
"YTIdentityStateLoggingController_API" = "SRLImplementation<0x2837656b0, instanceType: YTIdentityStateLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTIdentityStore_API" = "SRLImplementation<0x2837c9320, instanceType: YTIdentityStore, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityStrategy_API" = "SRLImplementation<0x2837c9110, instanceType: YTInlineIdentityStrategy, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityTransactionCoalescer_API" = "SRLImplementation<0x2837c9020, instanceType: YTIdentityTransactionCoalescer, lifetime: 0, scopeType: 4, configuration: None>";
"YTIdentityTransactionFactory_API" = "SRLImplementation<0x2837c90e0, instanceType: YTIdentityTransactionFactory, lifetime: 0, scopeType: 4, configuration: None>";
"YTImageFetcherService_API" = "SRLImplementation<0x2837cb300, instanceType: YTHotSwappableImageFetcherService, lifetime: 0, scopeType: 0, configuration: None>";
"YTImageOperationQueue_API" = "SRLImplementation<0x2836922e0, instanceType: YTImageOperationQueue, lifetime: 0, scopeType: 0, configuration: None>";
"YTImageSelectionStrategy_API" = "SRLImplementation<0x283692310, instanceType: YTBestMatchImageSelectionStrategy, lifetime: 0, scopeType: 0, configuration: None>";
"YTImageServiceImageDataSource_API" = "SRLImplementation<0x283692370, instanceType: YTOfflineLocalImageEntitySource, lifetime: 0, scopeType: 0, configuration: None>";
"YTImageService_API" = "SRLImplementation<0x2836922b0, instanceType: YTImageService, lifetime: 0, scopeType: 0, configuration: None>";
"YTImageStyle_API" = "SRLImplementation<0x2836bf180, instanceType: YTAppImageStyle, lifetime: 0, scopeType: 0, configuration: None>";
"YTInMemoryEntityStoreObserverTransformationTrigger_API" = "SRLImplementation<0x2829f03f0, instanceType: YTInMemoryEntityStoreObserverTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>";
"YTInMemoryEntityStore_API" = "SRLImplementation<0x28376bf30, instanceType: YTInMemoryEntityStoreV2, lifetime: 0, scopeType: 0, configuration: None>";
"YTInPlayerDAIExternallyManagedSlotAdapter_API" = "SRLImplementation<0x283487ba0, instanceType: YTInPlayerDAIExternallyManagedSlotAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTInceptionControllerProtocol_API" = "SRLImplementation<0x2836eac70, instanceType: YTInceptionController, lifetime: 0, scopeType: 0, configuration: None>";
"YTInfoCardControllerProviderProtocol_API" = "SRLImplementation<0x2834ace40, instanceType: YTInfoCardControllerProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTInlineMutedPlaybackStateController_API" = "SRLImplementation<0x28354bc60, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
"YTInlineMutedWatchEndpointMutationCommandHandler_API" = "SRLImplementation<0x282b80600, instanceType: YTInlineMutedWatchEndpointMutationCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
"YTInnerTubeConfig_API" = "SRLImplementation<0x2837cab20, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeContextFactory_API" = "SRLImplementation<0x2837fc210, instanceType: YTInnerTubeContextFactory, lifetime: 0, scopeType: 4, configuration: None>";
"YTInnerTubeControllerFactory_API" = "SRLImplementation<0x2836dc750, instanceType: YTAppInnerTubeControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeCoreDataContext_API" = "SRLImplementation<0x2836f47b0, instanceType: YTInnerTubeCoreDataContext, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeFetcherService_API" = "SRLImplementation<0x2837cff90, instanceType: YTHotSwappableFetcherServiceAndURLBuilder, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeOperationQueue_API" = "SRLImplementation<0x2837fc600, instanceType: YTInnerTubeOperationQueue, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeRequestFactory_API" = "SRLImplementation<0x2837fc1e0, instanceType: YTInnerTubeRequestFactory, lifetime: 0, scopeType: 4, configuration: None>";
"YTInnerTubeRequestorFactory_API" = "SRLImplementation<0x2837fc4b0, instanceType: YTInnerTubeRequestorFactory, lifetime: 0, scopeType: 4, configuration: None>";
"YTInnerTubeResponseCache_API" = "SRLImplementation<0x2837fc6f0, instanceType: YTInnerTubeResponseCache, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeRetryTaskController_API" = "SRLImplementation<0x2836fd2f0, instanceType: YTInnerTubeRetryTaskController, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeSharedData_API" = "SRLImplementation<0x2837fc6c0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeUIGlobals_API" = "SRLImplementation<0x2836c6a60, instanceType: YTLiveServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeUIServiceMapper_API" = "SRLImplementation<0x2836dc780, instanceType: YTAppInnerTubeUIServiceMapper, lifetime: 0, scopeType: 0, configuration: None>";
"YTInnerTubeURLBuilder_API" = "SRLImplementation<0x283765440, instanceType: YTHotSwappableFetcherServiceAndURLBuilder, lifetime: 0, scopeType: 0, configuration: None>";
"YTInteractionLoggingOnGELController_API" = "SRLImplementation<0x2836ad320, instanceType: YTInteractionLoggingOnGELController, lifetime: 0, scopeType: 0, configuration: None>";
"YTLastActionController_API" = "SRLImplementation<0x2837657a0, instanceType: YTLastActionController, lifetime: 0, scopeType: 0, configuration: None>";
"YTLastActionProvider_API" = "SRLImplementation<0x2837fcc90, instanceType: YTLastActionController, lifetime: 0, scopeType: 0, configuration: None>";
"YTLatencyLogger_API" = "SRLImplementation<0x2836ff1b0, instanceType: YTLatencyLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTLayoutFactory_API" = "SRLImplementation<0x28362a070, instanceType: YTLayoutFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTLayoutRenderingAdapterFactoryManager_API" = "SRLImplementation<0x2834ae250, instanceType: YTLayoutRenderingAdapterFactoryManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTLayoutSelfExitRequestedTriggerAdapter_API" = "SRLImplementation<0x282b88ab0, instanceType: YTLayoutSelfExitRequestedTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTLayoutStyle_API" = "SRLImplementation<0x283767540, instanceType: YTAppLayoutStyle, lifetime: 0, scopeType: 0, configuration: None>";
"YTLiveMidrollCuepointOpportunityAdapter_API" = "SRLImplementation<0x283487990, instanceType: YTLiveMidrollCuepointOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTLiveStreamBreakTransitionTriggerAdapter_API" = "SRLImplementation<0x283487ae0, instanceType: YTLiveStreamBreakTransitionTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTLocationInfoMonitor_API" = "SRLImplementation<0x2837198c0, instanceType: YTLocationInfoMonitor, lifetime: 0, scopeType: 0, configuration: None>";
"YTLockScreenController_API" = "SRLImplementation<0x283487d20, instanceType: YTLockScreenController, lifetime: 0, scopeType: 0, configuration: None>";
"YTLoggingCoreDataContext_API" = "SRLImplementation<0x2837ef720, instanceType: YTLoggingCoreDataContext, lifetime: 0, scopeType: 0, configuration: None>";
"YTLoggingDispatchQueue_API" = "SRLImplementation<0x2837fcf30, instanceType: YTLoggingDispatchQueue, lifetime: 0, scopeType: 0, configuration: None>";
"YTLoggingIdentityProvider_API" = "SRLImplementation<0x2837ca7c0, instanceType: YTLoggingIdentityProvider, lifetime: 0, scopeType: 4, configuration: None>";
"YTLoggingURLController_API" = "SRLImplementation<0x283650600, instanceType: YTLoggingURLController, lifetime: 0, scopeType: 0, configuration: None>";
"YTMERegistry_API" = "SRLImplementation<0x2836cd440, instanceType: YTMERegistry, lifetime: 0, scopeType: 0, configuration: None>";
"YTMacroMarkersController_API" = "SRLImplementation<0x282b87ea0, instanceType: YTMacroMarkersController, lifetime: 0, scopeType: 0, configuration: None>";
"YTMacroMarkersTimedSyncController_API" = "SRLImplementation<0x282b87f90, instanceType: YTMacroMarkersTimedSyncController, lifetime: 0, scopeType: 0, configuration: None>";
"YTMainAppDiscoveryInPlayerRenderingAPI_API" = "SRLImplementation<0x282b829a0, instanceType: YTMainAppDiscoveryInPlayerRenderingAPI, lifetime: 0, scopeType: 0, configuration: None>";
"YTMainAppEngagementPanelDataCollector_API" = "SRLImplementation<0x283681b30, instanceType: YTMainAppEngagementPanelDataCollector, lifetime: 0, scopeType: 0, configuration: None>";
"YTMainAppPlayerOverlayDataCollector_API" = "SRLImplementation<0x282b86130, instanceType: YTMainAppPlayerOverlayDataCollector, lifetime: 0, scopeType: 0, configuration: None>";
"YTMemoryWatchdog_API" = "SRLImplementation<0x28368a1c0, instanceType: YTMemoryWatchdog, lifetime: 0, scopeType: 0, configuration: None>";
"YTNavigationCommandHandler_API" = "SRLImplementation<0x2836d8ff0, instanceType: YTNavigationCommandHandler, lifetime: 0, scopeType: 0, configuration: None>";
"YTNetworkActiveController_API" = "SRLImplementation<0x283562820, instanceType: YTNetworkActiveControllerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTNetworkBaselineLogger_API" = "SRLImplementation<0x2837fcb10, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTNetworkEventLogger_API" = "SRLImplementation<0x2837fc960, instanceType: YTNetworkEventLogger, lifetime: 0, scopeType: 0, configuration: None>";
"YTNetworkHealthController_API" = "SRLImplementation<0x2836f4660, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTNetworkHealthLogger_API" = "SRLImplementation<0x2837fc930, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTNetworkReceivedDelegate_API" = "SRLImplementation<0x2837fc690, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTNetworkRequestTracker_API" = "SRLImplementation<0x2837cb330, instanceType: YTNetworkRequestTrackerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTNetworkRetryDelegate_API" = "SRLImplementation<0x2837fc420, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTNetworkStatusEntityTransformationTrigger_API" = "SRLImplementation<0x2836eab50, instanceType: YTNetworkStatusEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>";
"YTNetworkUsageNotifier_API" = "SRLImplementation<0x28357eac0, instanceType: YTNetworkUsageNotifier, lifetime: 0, scopeType: 0, configuration: None>";
"YTNonCriticalStartupSchedulerConfig_API" = "SRLImplementation<0x28376fc60, instanceType: YTAppNonCriticalStartupSchedulerConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTNonCriticalStartupScheduler_API" = "SRLImplementation<0x28376fc00, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
"YTNotificationAccountScopedInnerTubeContextDecorator_API" = "SRLImplementation<0x2836aa910, instanceType: YTNotificationAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>";
"YTNotificationConfig_API" = "SRLImplementation<0x283682730, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTNotificationInnerTubeContextDecorator_API" = "SRLImplementation<0x2836aa760, instanceType: YTNotificationInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>";
"YTNotificationOSSettingEntityController_API" = "SRLImplementation<0x2834803c0, instanceType: YTNotificationOSSettingEntityController, lifetime: 0, scopeType: 0, configuration: None>";
"YTNotificationRegistrationManager_API" = "SRLImplementation<0x283682760, instanceType: YTNotificationRegistrationManager, lifetime: 1, scopeType: 0, configuration: None>";
"YTNotificationService_API" = "SRLImplementation<0x283682790, instanceType: YTNotificationService, lifetime: 0, scopeType: 0, configuration: None>";
"YTNthThumbnailLoadInstrumentation_API" = "SRLImplementation<0x283684f60, instanceType: YTNthThumbnailLoadInstrumentation, lifetime: 0, scopeType: 0, configuration: None>";
"YTNthThumbnailLoadTransmitter_API" = "SRLImplementation<0x28356e190, instanceType: YTAppStartupInstrumentationThumbnailLoadTransmitter, lifetime: 0, scopeType: 0, configuration: None>";
"YTOcclusionMonitoringController_API" = "SRLImplementation<0x2836ead90, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineAdController_API" = "SRLImplementation<0x28369f660, instanceType: YTOfflineAdController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineAdFrequencyCapProvider_API" = "SRLImplementation<0x283494c30, instanceType: YTOfflineAdFrequencyCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineAdParser_API" = "SRLImplementation<0x28369f690, instanceType: YTOfflineAdParser, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineAdPlaylistController_API" = "SRLImplementation<0x283682580, instanceType: YTOfflineAdPlaylistController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineAdProvider_API" = "SRLImplementation<0x282bbb000, instanceType: YTOfflineAdPlaylistController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineAppStateEventCenter_API" = "SRLImplementation<0x2836fd320, instanceType: YTOfflineAppStateEventCenter, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineCacheSynchronizer_API" = "SRLImplementation<0x2836f4870, instanceType: YTOfflineCacheSynchronizer, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineClientStateLogger_API" = "SRLImplementation<0x2836fed90, instanceType: YTOfflineClientStateLogger, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineClientStateProvider_API" = "SRLImplementation<0x2836fedc0, instanceType: YTOfflineClientStateProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineConfig_API" = "SRLImplementation<0x283682280, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineContentController_API" = "SRLImplementation<0x28349d9e0, instanceType: YTOfflineContentController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineCoordinator_API" = "SRLImplementation<0x283685560, instanceType: YTOfflineCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineDataService_API" = "SRLImplementation<0x2836821f0, instanceType: YTOfflineDataService, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineEntityGenerationController_API" = "SRLImplementation<0x2836feb20, instanceType: YTOfflineEntityGenerationController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineImageController_API" = "SRLImplementation<0x2836822b0, instanceType: YTOfflineImageController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineModeProvider_API" = "SRLImplementation<0x28369f630, instanceType: YTOfflineCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineNotificationController_API" = "SRLImplementation<0x28356ff30, instanceType: YTOfflineNotificationController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineOrchestrationAutoRefreshController_API" = "SRLImplementation<0x2836fed00, instanceType: YTOfflineOrchestrationAutoRefreshController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineOrchestrationController_API" = "SRLImplementation<0x2836fedf0, instanceType: YTOfflineOrchestrationController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflinePlaybackPositionSyncService_API" = "SRLImplementation<0x28349e460, instanceType: YTOfflinePlaybackPositionSyncService, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflinePlaylistController_API" = "SRLImplementation<0x283682520, instanceType: YTOfflinePlaylistController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflinePlaylistMonitor_API" = "SRLImplementation<0x282b9b5d0, instanceType: YTNoOpOfflinePlaylistMonitor, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflinePlaylistStore_API" = "SRLImplementation<0x2836f48d0, instanceType: YTOfflinePlaylistStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineRefreshEntityQueryTable_API" = "SRLImplementation<0x2836fec10, instanceType: YTOfflineRefreshEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineServiceController_API" = "SRLImplementation<0x28369dec0, instanceType: YTAppOfflineServiceController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineSettingsServiceSwitch_API" = "SRLImplementation<0x2836825e0, instanceType: YTOfflineSettingsServiceSwitch, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineSettingsService_API" = "SRLImplementation<0x283682610, instanceType: YTOfflineSettingsService, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineStoreAPI_API" = "SRLImplementation<0x282bbafd0, instanceType: YTOfflineStoreAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineTracklistCaptionController_API" = "SRLImplementation<0x2836820d0, instanceType: YTOfflineTracklistCaptionController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineTransferStatusLogger_API" = "SRLImplementation<0x2836f3060, instanceType: YTOfflineTransferStatusLogger, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineVideoController_API" = "SRLImplementation<0x2836821c0, instanceType: YTOfflineVideoController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineVideoDownloadScheduler_API" = "SRLImplementation<0x2836f3330, instanceType: YTOfflineVideoDownloadScheduler, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineVideoDownloader_API" = "SRLImplementation<0x2836f3240, instanceType: YTOfflineVideoDownloader, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineVideoListController_API" = "SRLImplementation<0x283682550, instanceType: YTOfflineVideoListController, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineVideoRepairWorker_API" = "SRLImplementation<0x2834809c0, instanceType: YTOfflineVideoRepairWorker, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineVideoStore_API" = "SRLImplementation<0x2836fd260, instanceType: YTOfflineVideoStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTOfflineWatchNextServiceAdapter_API" = "SRLImplementation<0x282badf50, instanceType: YTAppOfflineWatchNextServiceAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTOrganicWatchNextResponseOpportunityAdapter_API" = "SRLImplementation<0x2834876f0, instanceType: YTOrganicWatchNextResponseOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTPageStyleController_API" = "SRLImplementation<0x2837103f0, instanceType: YTPageStyleController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPeriodicLoggingController_API" = "SRLImplementation<0x2837656e0, instanceType: YTPeriodicLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPersistentToInMemoryEntityStoreProjectionController_API" = "SRLImplementation<0x2836e9740, instanceType: YTPersistentToInMemoryEntityStoreProjectionController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPersonalizedSuggestionsCache_API" = "SRLImplementation<0x283698270, instanceType: YTPersonalizedSuggestionsCache, lifetime: 0, scopeType: 0, configuration: None>";
"YTPhotoUploadController_API" = "SRLImplementation<0x283692250, instanceType: YTPhotoUploadController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPingControllerConfig_API" = "SRLImplementation<0x2836fd6b0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTPingService_API" = "SRLImplementation<0x28368c0c0, instanceType: YTPingService, lifetime: 0, scopeType: 0, configuration: None>";
"YTPingStore_API" = "SRLImplementation<0x28368c060, instanceType: YTPingStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTPingingEndpointCommandHandler_API" = "SRLImplementation<0x2835651a0, instanceType: YTPingingEndpointCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
"YTPivotBarProvider_API" = "SRLImplementation<0x283614ed0, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayAsYouBrowseSettingController_API" = "SRLImplementation<0x2836eadc0, instanceType: YTPlayAsYouBrowseSettingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlaybackCoordinator_API" = "SRLImplementation<0x283483060, instanceType: MDXPlaybackCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlaybackLockScreenController_API" = "SRLImplementation<0x283487cf0, instanceType: YTPlaybackLockScreenController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlaybackRequestFactory_API" = "SRLImplementation<0x2834b0d80, instanceType: YTPlaybackRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlaybackRouteButtonControllerProvider_API" = "SRLImplementation<0x2836c21c0, instanceType: MDXRealServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlaybackTrackingLayoutRenderingAdapterFactory_API" = "SRLImplementation<0x2834ae580, instanceType: YTPlaybackTrackingLayoutRenderingAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlaybackTrackingSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x2834a64f0, instanceType: YTPlaybackTrackingSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerAccountScopedInnerTubeContextDecorator_API" = "SRLImplementation<0x2834adfb0, instanceType: YTPlayerAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>";
"YTPlayerAdEventTriggerAdapter_API" = "SRLImplementation<0x283487930, instanceType: YTPlayerAdEventTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerAdsProvider_API" = "SRLImplementation<0x283487720, instanceType: YTRealAdsPlayerServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerBytesLayoutEnteredAndFullscreenOpportunityAdapter_API" = "SRLImplementation<0x28349b990, instanceType: YTPlayerBytesLayoutEnteredAndFullscreenOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerBytesLayoutEnteredOpportunityAdapter_API" = "SRLImplementation<0x28349bb40, instanceType: YTPlayerBytesLayoutEnteredOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerBytesLayoutRenderingAdapterFactory_API" = "SRLImplementation<0x282b88210, instanceType: YTPlayerBytesLayoutRenderingAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerBytesSlotAdapterFactory_API" = "SRLImplementation<0x282bbb180, instanceType: YTPlayerBytesSlotAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerBytesSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x282bbaf10, instanceType: YTPlayerBytesSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerBytesSlotRegistrationAPI_API" = "SRLImplementation<0x283487c90, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerInnerTubeContextDecorator_API" = "SRLImplementation<0x2834adef0, instanceType: YTPlayerInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>";
"YTPlayerOfflineFallbackConfig_API" = "SRLImplementation<0x2834897d0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerPrebufferController_API" = "SRLImplementation<0x2834b0bd0, instanceType: YTPlayerPrebufferController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerPrefetchService_API" = "SRLImplementation<0x283497360, instanceType: YTPlayerPrefetchService, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerRequestFactory_API" = "SRLImplementation<0x2834b0de0, instanceType: YTPlayerRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerScrubLoggingService_API" = "SRLImplementation<0x28348f960, instanceType: YTPlayerScrubLoggingService, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerServiceConfig_API" = "SRLImplementation<0x2834887b0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerService_API" = "SRLImplementation<0x2834b1fb0, instanceType: YTPlayerService, lifetime: 0, scopeType: 0, configuration: None>";
"YTPlayerViewControllerConfig_API" = "SRLImplementation<0x283483030, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTPreviousQuery_API" = "SRLImplementation<0x283698480, instanceType: YTPreviousQuery, lifetime: 0, scopeType: 0, configuration: None>";
"YTPriorityLoader_API" = "SRLImplementation<0x28376bcc0, instanceType: YTPriorityLoader, lifetime: 0, scopeType: 0, configuration: None>";
"YTProfileCardController_API" = "SRLImplementation<0x282b80b40, instanceType: YTProfileCardController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPromosheetController_API" = "SRLImplementation<0x283690ff0, instanceType: YTPromosheetController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPushNotificationController_API" = "SRLImplementation<0x283682700, instanceType: YTPushNotificationController, lifetime: 0, scopeType: 0, configuration: None>";
"YTPushNotificationService_API" = "SRLImplementation<0x2837d3bd0, instanceType: YTPushNotificationService, lifetime: 0, scopeType: 0, configuration: None>";
"YTQueueConfig_API" = "SRLImplementation<0x282b99ad0, instanceType: YTDefaultQueueConfig, lifetime: 0, scopeType: 0, configuration: None>";
"YTReachabilityController_API" = "SRLImplementation<0x2837fc240, instanceType: YTReachabilityController, lifetime: 0, scopeType: 0, configuration: None>";
"YTReelImageFetcher_API" = "SRLImplementation<0x2836f4030, instanceType: YTReelImageFetcher, lifetime: 0, scopeType: 0, configuration: None>";
"YTRenderingConfig_API" = "SRLImplementation<0x2836c6fd0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTResponderRoot_API" = "SRLImplementation<0x283762dc0, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
"YTRestoreController_API" = "SRLImplementation<0x2836842d0, instanceType: YTRestoreController, lifetime: 0, scopeType: 0, configuration: None>";
"YTRetroactiveSignInController_API" = "SRLImplementation<0x28357e580, instanceType: YTRetroactiveSignInController, lifetime: 0, scopeType: 0, configuration: None>";
"YTSRLAccountSynchronizer_API" = "SRLImplementation<0x283480270, instanceType: YTSRLAccountSynchronizer, lifetime: 0, scopeType: 0, configuration: None>";
"YTSSOConfig_API" = "SRLImplementation<0x2837c9e00, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTScrollFocusGlobalStateMonitor_API" = "SRLImplementation<0x28348c7b0, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
"YTScrollFocusGlobalStateProtocol_API" = "SRLImplementation<0x283608690, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
"YTSeamlessSignIn_API" = "SRLImplementation<0x28360c210, instanceType: YTSeamlessSignIn, lifetime: 0, scopeType: 0, configuration: None>";
"YTSearchHistoryService_API" = "SRLImplementation<0x2836984e0, instanceType: YTSearchHistoryService, lifetime: 0, scopeType: 0, configuration: None>";
"YTSearchLatencyCache_API" = "SRLImplementation<0x283698630, instanceType: YTSearchLatencyCache, lifetime: 0, scopeType: 0, configuration: None>";
"YTSearchService_API" = "SRLImplementation<0x2834eab20, instanceType: YTAppSearchService, lifetime: 0, scopeType: 0, configuration: None>";
"YTSearchboxStatsTracker_API" = "SRLImplementation<0x28369de00, instanceType: YTSearchboxStatsTracker, lifetime: 0, scopeType: 0, configuration: None>";
"YTServices_API" = "SRLImplementation<0x283694060, instanceType: YTLiveServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTSettings_API" = "SRLImplementation<0x28379bfc0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTShareObserverController_API" = "SRLImplementation<0x282b997d0, instanceType: YTShareObserverController, lifetime: 0, scopeType: 0, configuration: None>";
"YTShareServices_API" = "SRLImplementation<0x282bd4390, instanceType: YTRealShareServices, lifetime: 0, scopeType: 0, configuration: None>";
"YTShortsStartupCoordinator_API" = "SRLImplementation<0x2836f4180, instanceType: YTShortsStartupCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
"YTShowContentPillNotifier_API" = "SRLImplementation<0x2836c6f70, instanceType: YTShowContentPillCommandHandlerClassObservable, lifetime: 0, scopeType: 0, configuration: None>";
"YTShowTooltipCommandHandler_API" = "SRLImplementation<0x28291dbc0, instanceType: YTShowTooltipCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
"YTShowTransientPlayerScrimOverlayCommandHandlerClassDelegation_API" = "SRLImplementation<0x282b80870, instanceType: YTShowTransientPlayerScrimOverlayCommandHandlerClassDelegation, lifetime: 0, scopeType: 0, configuration: None>";
"YTSignedOutLocalSearchHistory_API" = "SRLImplementation<0x283482c10, instanceType: YTSignedOutLocalSearchHistory, lifetime: 0, scopeType: 0, configuration: None>";
"YTSingleVideoControllerFactory_API" = "SRLImplementation<0x2834b0c60, instanceType: YTSingleVideoControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTSingleVideoOfflineLoggingController_API" = "SRLImplementation<0x2834a72d0, instanceType: YTSingleVideoOfflineLoggingController__657306411_GeneratedFactoryImpl, lifetime: 1, scopeType: 0, configuration: None>";
"YTSiriShortcutManager_API" = "SRLImplementation<0x2836fd800, instanceType: YTSiriShortcutManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTSkipButtonClickedTriggerAdapter_API" = "SRLImplementation<0x282b88360, instanceType: YTSkipButtonClickedTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
"YTSlimStatusBarController_API" = "SRLImplementation<0x283698900, instanceType: YTSlimStatusBarController, lifetime: 0, scopeType: 0, configuration: None>";
"YTSlotAdapterFactoryManager_API" = "SRLImplementation<0x2834a6460, instanceType: YTSlotAdapterFactoryManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTSlotFactory_API" = "SRLImplementation<0x283629fe0, instanceType: YTSlotFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTSlotOpportunityAdapterDelegate_API" = "SRLImplementation<0x28349a250, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTSmartDownloadsSettingsObserver_API" = "SRLImplementation<0x2836feac0, instanceType: YTSmartDownloadsSettingsObserver, lifetime: 0, scopeType: 0, configuration: None>";
"YTStallDetector_API" = "SRLImplementation<0x283684090, instanceType: YTStallDetector, lifetime: 0, scopeType: 0, configuration: None>";
"YTStallMinidumpGenerator_API" = "SRLImplementation<0x2837f7090, instanceType: YTStallMinidumpGenerator, lifetime: 0, scopeType: 0, configuration: None>";
"YTStateTagNotifications_API" = "SRLImplementation<0x2837fc750, instanceType: YTStateTagNotifications, lifetime: 0, scopeType: 0, configuration: None>";
"YTStorageController_API" = "SRLImplementation<0x28369e160, instanceType: YTStorageController, lifetime: 0, scopeType: 0, configuration: None>";
"YTStoryboardControllerFactory_API" = "SRLImplementation<0x2834ac9f0, instanceType: YTStoryboardControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTSubscriptionService_API" = "SRLImplementation<0x2836da4c0, instanceType: YTSubscriptionService, lifetime: 0, scopeType: 0, configuration: None>";
"YTSuggestConfig_API" = "SRLImplementation<0x283698390, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTSuggestParser_API" = "SRLImplementation<0x283482100, instanceType: YTAppSuggestParser, lifetime: 0, scopeType: 0, configuration: None>";
"YTSuggestRequestFactory_API" = "SRLImplementation<0x283698420, instanceType: YTAppSuggestRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTSuggestService_API" = "SRLImplementation<0x2836983f0, instanceType: YTSuggestService, lifetime: 0, scopeType: 0, configuration: None>";
"YTSystemHealthCapturerRegistry_API" = "SRLImplementation<0x2837cb180, instanceType: YTSystemHealthCapturerRegistry, lifetime: 0, scopeType: 0, configuration: None>";
"YTSystemHealthContext_API" = "SRLImplementation<0x2837cadf0, instanceType: YTSystemHealthContext, lifetime: 0, scopeType: 0, configuration: None>";
"YTSystemHealthController_API" = "SRLImplementation<0x2837ca730, instanceType: YTSystemHealthController, lifetime: 0, scopeType: 0, configuration: None>";
"YTSystemHealthTransmitterRegistry_API" = "SRLImplementation<0x2837ca160, instanceType: YTSystemHealthTransmitterRegistry, lifetime: 0, scopeType: 0, configuration: None>";
"YTSystemNotifications_API" = "SRLImplementation<0x2837cb090, instanceType: YTSystemNotifications, lifetime: 0, scopeType: 0, configuration: None>";
"YTTerminationEventPingController_API" = "SRLImplementation<0x2836d9050, instanceType: YTTerminationEventPingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTThemeEntityManager_API" = "SRLImplementation<0x283690cc0, instanceType: YTThemeEntityManager, lifetime: 0, scopeType: 0, configuration: None>";
"YTThumbnailLatencyLogger_API" = "SRLImplementation<0x2836929d0, instanceType: YTCSIThumbnailLatencyLogger, lifetime: 0, scopeType: 0, configuration: None>";
"YTToastController_API" = "SRLImplementation<0x282baf9c0, instanceType: YTMainAppToastController, lifetime: 0, scopeType: 0, configuration: None>";
"YTTooltipController_API" = "SRLImplementation<0x2836b2670, instanceType: YTTooltipController, lifetime: 0, scopeType: 0, configuration: None>";
"YTTopViewControllerProvider_API" = "SRLImplementation<0x2836db540, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
"YTTransactionQueueController_API" = "SRLImplementation<0x28369e100, instanceType: YTTransactionQueueController, lifetime: 0, scopeType: 0, configuration: None>";
"YTTriggerAdapterDelegate_API" = "SRLImplementation<0x28349b9f0, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
"YTTriggerAdapterFactory_API" = "SRLImplementation<0x283499b90, instanceType: YTTriggerAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTTypeStyle_API" = "SRLImplementation<0x283693a80, instanceType: YTDefaultTypeStyle, lifetime: 0, scopeType: 0, configuration: None>";
"YTUnicornTimelyBlockingController_API" = "SRLImplementation<0x2836aed90, instanceType: YTUnicornTimelyBlockingController, lifetime: 0, scopeType: 0, configuration: None>";
"YTUnpluggedResolveLocationService_API" = "SRLImplementation<0x283713cf0, instanceType: YTUnpluggedResolveLocationService, lifetime: 0, scopeType: 0, configuration: None>";
"YTUpdatedMetadataService_API" = "SRLImplementation<0x282b862e0, instanceType: YTUpdatedMetadataService, lifetime: 0, scopeType: 0, configuration: None>";
"YTUpgradeController_API" = "SRLImplementation<0x28357f120, instanceType: YTUpgradeController, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadAppSpecificRequirementsStore_API" = "SRLImplementation<0x28362be40, instanceType: YTUploadAppSpecificRequirementsStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadConfig_API" = "SRLImplementation<0x28349e610, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadCoreDataContext_API" = "SRLImplementation<0x28349ea60, instanceType: YTUploadCoreDataContext, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadEngine_API" = "SRLImplementation<0x283480ae0, instanceType: YTUploadEngine, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadProgressProvider_API" = "SRLImplementation<0x283480300, instanceType: YTUploadProgressProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadRequirementsStore_API" = "SRLImplementation<0x28362b300, instanceType: YTUploadRequirementsStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadTaskController_API" = "SRLImplementation<0x283480b10, instanceType: YTUploadTaskController, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadTaskStore_API" = "SRLImplementation<0x28349eca0, instanceType: YTUploadTaskStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTUploadUserSpecificRequirementsStore_API" = "SRLImplementation<0x283484060, instanceType: YTUploadUserSpecificRequirementsStore, lifetime: 0, scopeType: 0, configuration: None>";
"YTUserDefaultsKeysProvider_API" = "SRLImplementation<0x2837b0630, instanceType: YTYouTubeUserDefaultsKeysProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTUserDefaults_API" = "SRLImplementation<0x2837b05a0, instanceType: YTYouTubeUserDefaults, lifetime: 0, scopeType: 4, configuration: None>";
"YTVASTParser_API" = "SRLImplementation<0x283681bf0, instanceType: YTVASTParser, lifetime: 0, scopeType: 0, configuration: None>";
"YTVELoggingAPIProvider_API" = "SRLImplementation<0x282b81ad0, instanceType: YTVELoggingAPIProvider, lifetime: 0, scopeType: 0, configuration: None>";
"YTVMAPParser_API" = "SRLImplementation<0x283681f20, instanceType: YTVMAPParser, lifetime: 0, scopeType: 0, configuration: None>";
"YTVSSControllerFactory_API" = "SRLImplementation<0x2834ab000, instanceType: YTVSSControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTVideoPlayerOverlayConfig_API" = "SRLImplementation<0x2836a4150, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
"YTVideoQualitySwitchControllerFactory_API" = "SRLImplementation<0x283561770, instanceType: YTVideoQualitySwitchControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
"YTVisitorDataRequestDecorator_API" = "SRLImplementation<0x2837fc990, instanceType: YTVisitorDataRequestDecorator, lifetime: 0, scopeType: 4, configuration: None>";
"YTVisitorDataStore_API" = "SRLImplementation<0x2837fc900, instanceType: YTIdentityController, lifetime: 0, scopeType: 4, configuration: None>";
"YTVoiceSearchCache_API" = "SRLImplementation<0x2834f60a0, instanceType: YTVoiceSearchCache, lifetime: 0, scopeType: 0, configuration: None>";
"YTVoiceSearchService_API" = "SRLImplementation<0x28369de60, instanceType: YTVoiceSearchService, lifetime: 0, scopeType: 0, configuration: None>";
"YTWatchBreakController_API" = "SRLImplementation<0x2836a1aa0, instanceType: YTWatchBreakController, lifetime: 0, scopeType: 0, configuration: None>";
"YTWatchEventCenter_API" = "SRLImplementation<0x2836a4390, instanceType: YTWatchEventCenter, lifetime: 0, scopeType: 0, configuration: None>";
"YTWatchHistoryService_API" = "SRLImplementation<0x2834e97d0, instanceType: YTWatchHistoryService, lifetime: 0, scopeType: 1, configuration: None>";
"YTWatchHistoryStatusNotifier_API" = "SRLImplementation<0x28349e100, instanceType: YTWatchHistoryStatusNotifier, lifetime: 0, scopeType: 0, configuration: None>";
"YTWatchNextResponseFetcherAPI_API" = "SRLImplementation<0x282bbafa0, instanceType: YTAdBreakRendererFetcher, lifetime: 0, scopeType: 0, configuration: None>";
"YTWatchNextService_API" = "SRLImplementation<0x282b9b090, instanceType: YTAppWatchNextService, lifetime: 0, scopeType: 0, configuration: None>";
"YTWorkerController_API" = "SRLImplementation<0x28368a220, instanceType: YTWorkerController, lifetime: 0, scopeType: 0, configuration: None>";
"YTWorkerScheduler_API" = "SRLImplementation<0x28357e880, instanceType: YTWorkerScheduler, lifetime: 0, scopeType: 0, configuration: None>";
"YTYouTubeUserDefaults_API" = "SRLImplementation<0x2837f7f00, instanceType: YTYouTubeUserDefaults, lifetime: 0, scopeType: 4, configuration: None>";
}
Multi bindings:
{
"ELMMissingResourceHandler_API" = "{(\n)}";
"ELMSecurityVerifier_API" = "{(\n)}";
"YTAccountScopedInnerTubeContextDecorator_API" = "{(\n SRLImplementation<0x2834e94a0, instanceType: YTAccountScopedAdsInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n SRLImplementation<0x2834e9710, instanceType: YTDataPushInnerTubeContextDecorator, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2834e92c0, instanceType: YTELMAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n SRLImplementation<0x2834e82a0, instanceType: MLAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n SRLImplementation<0x2834e9e30, instanceType: YTAccountScopedClientStoreInfoInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n SRLImplementation<0x2834e9da0, instanceType: YTNotificationAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n SRLImplementation<0x2834e9890, instanceType: YTLocationAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n SRLImplementation<0x2834e9c80, instanceType: YTPlayerAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>\n)}";
"YTAppBrowseServiceRequestDecorator_API" = "{(\n SRLImplementation<0x283713030, instanceType: YTDownloadsBrowseParamsBrowseRequestDecorator, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTAppBrowseServiceResponseProvider_API" = "{(\n SRLImplementation<0x2836b2640, instanceType: YTAppBrowseServiceLibraryResponseProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283689f80, instanceType: YTAppBrowseServicePlaylistResponseProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2836b0780, instanceType: YTAppBrowseServiceHomeResponseProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTBackgroundAppRefreshTask_API" = "{(\n SRLImplementation<0x2836cadf0, instanceType: YTAppBackgroundAppRefreshTask, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTBackgroundProcessingTask_API" = "{(\n SRLImplementation<0x2836cae50, instanceType: YTAppBackgroundProcessingTask, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTElementsCommandExtensionRegistryProvider_API" = "{(\n SRLImplementation<0x283572bb0, instanceType: YTCommentElementsCommandRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283572b80, instanceType: YTAdsElementsCommandExtensionRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283572b50, instanceType: YTAccountElementsCommandExtensionRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTElementsNodeClassRegistryProvider_API" = "{(\n SRLImplementation<0x283572dc0, instanceType: YTAdsElementsNodeClassRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283572df0, instanceType: YTCommentElementsNodeClassRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283572e20, instanceType: YTSuggestElementsNodeClassRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTEntityMergerProvider_API" = "{(\n SRLImplementation<0x283718ed0, instanceType: YTMarkersEngagementPanelSyncEntityMergerProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTEntityStoreQueryTable_API" = "{(\n SRLImplementation<0x283718c00, instanceType: YTTransferEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283718ba0, instanceType: YTOfflineActionWrapperEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283718c30, instanceType: YTOfflineRefreshEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTEntityTransformationTriggerProtocol_API" = "{(\n SRLImplementation<0x28361d020, instanceType: YTNetworkStatusEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361d050, instanceType: YTPersistentEntityStoreObserverTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361d0b0, instanceType: YTInMemoryEntityStoreObserverTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361ea60, instanceType: YTClockEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTEntityTransformerProtocol_API" = "{(\n SRLImplementation<0x28361a250, instanceType: YTMainDownloadedVideoEntityToDownloadStatusEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361adc0, instanceType: YTMainDownloadsListEntityToSmartDownloadsHeaderEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361a580, instanceType: YTMainDownloadedVideoEntityToDownloadsPageVideoEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361ae50, instanceType: YTMainRecommendedDownloadVideoEntityToDownloadsPageRecommendedVideoEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2836ee130, instanceType: YTMainVideoEntityToDownloadStatusEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2836eb8a0, instanceType: YTMainVideoEntityToDownloadsPageVideoEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361a220, instanceType: YTMainDownloadedVideoEntityToDownloadedVideoWithContextEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28361ab50, instanceType: YTMainDownloadedPlaylistEntityToDownloadStatusEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283619e90, instanceType: YTMainDownloadedPlaylistEntityToDownloadsPagePlaylistEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeCellControllerRegistrationProvider_API" = "{(\n SRLImplementation<0x2836036f0, instanceType: YTReelInnerTubeCellControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeCellRegistrationProvider_API" = "{(\n SRLImplementation<0x28361f150, instanceType: YTReelInnerTubeCellRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeCommandRegistrationProvider_API" = "{(\n SRLImplementation<0x283681b90, instanceType: YTFlowCommandRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283681bc0, instanceType: YTReelInnerTubeCommandRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeContextDecorator_API" = "{(\n SRLImplementation<0x283714960, instanceType: YTELMInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n SRLImplementation<0x283714690, instanceType: YTClientStoreInfoInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n SRLImplementation<0x283714a50, instanceType: MLInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n SRLImplementation<0x283714930, instanceType: YTLocationInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n SRLImplementation<0x2837148d0, instanceType: YTDataPushInnerTubeContextDecorator, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x283714a80, instanceType: YTNotificationInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n SRLImplementation<0x283714b10, instanceType: YTPlayerInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n SRLImplementation<0x283714630, instanceType: YTAdsInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>\n)}";
"YTInnerTubeControllerRegistrationProvider_API" = "{(\n SRLImplementation<0x2836dcea0, instanceType: YTReelShortsInnerTubeControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2836dce70, instanceType: YTARCameraInnerTubeControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeSectionControllerMatchingRegistrationProvider_API" = "{(\n SRLImplementation<0x2836c0120, instanceType: YTReelInnerTubeSectionControllerMatchingRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeTopControllerRegistrationProvider_API" = "{(\n SRLImplementation<0x2836dc7b0, instanceType: YTEditInnerTubeTopControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2836dc7e0, instanceType: YTLiveCreationInnerTubeTopControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2836dc810, instanceType: YTReelInnerTubeTopControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTInnerTubeViewControllerMatchingRegistrationProvider_API" = "{(\n)}";
"YTMainWindowObserver_API" = "{(\n SRLImplementation<0x28369f570, instanceType: YTELMWindowFrameObserver, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28369f5a0, instanceType: YTLastActionController, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTModuleInitializer_API" = "{(\n SRLImplementation<0x2837cf120, instanceType: YTInnerTubeModuleInitializer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2837cf0c0, instanceType: YTAccountModuleInitializer, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x2837cf0f0, instanceType: YTFamilyManagementModuleInitializer, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTPlaybackContextDecorator_API" = "{(\n SRLImplementation<0x2834b0e10, instanceType: MDXYTPlaybackContextDecorator, lifetime: 0, scopeType: 0, configuration: None>\n)}";
"YTUploadFlowFactory_API" = "{(\n SRLImplementation<0x28349e9d0, instanceType: YTUploadFeedbackOnlyFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28349e6a0, instanceType: YTUploadShortsFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28349e5e0, instanceType: YTUploadNormalFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28349e910, instanceType: YTUploadArchiveReplacementFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n SRLImplementation<0x28349eac0, instanceType: YTUploadReelsFlowFactory, lifetime: 0, scopeType: 0, configuration: None>\n)}";
}
某个广告视频的内部返回数据:
hook代码:
- (void)setVideoDetails:(id)arg1{
iosLogInfo("arg1=%@", arg1);
%orig;
}
输出:
2022-03-28 20:36:41.954044+0800 YouTube[25775:2715494] hook_ youtubeDylib.xm YTWatchMiniBarViewController$setVideoDetails$: arg1=<YTIVideoDetails 0x281b27f40>: {
video_id: "LA6szWzus0g"
title: "Get Chrome for iOS"
length_seconds: 30
channel_id: "UCL8ZULXASCc1I_oaOT0NaOQ"
is_owner_viewing: false
short_description: "Chrome is a fast, easy to use, and secure web browser for iOS. Get Chrome now. https://apps.apple.com/us/app/google-chrome/id535886823"
is_crawlable: false
thumbnail {
thumbnails {
url: "https://i.ytimg.com/vi/LA6szWzus0g/hqdefault.jpg?sqp=-oaymwEYCHgQWkhG8quKqQMMCAEVAACIQnABwAEG&rs=AOn4CLBU26fMso0e3iR2comi4Uz-x5cj7Q"
width: 120
height: 90
}
thumbnails {
url: "https://i.ytimg.com/vi/LA6szWzus0g/hqdefault.jpg?sqp=-oaymwEcCIACEJABSEbyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA2zPsvsB2aQxkZvfPFXMVhwdkpHQ"
width: 256
height: 144
}
thumbnails {
url: "https://i.ytimg.com/vi/LA6szWzus0g/hqdefault.jpg?sqp=-oaymwEcCMACELQBSEbyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDOaI6fXD2ptZTQmDP1myZBfcg13Q"
width: 320
height: 180
}
thumbnails {
url: "https://i.ytimg.com/vi_webp/LA6szWzus0g/hqdefault.webp"
width: 480
height: 360
}
thumbnails {
url: "https://i.ytimg.com/vi_webp/LA6szWzus0g/sddefault.webp"
width: 640
height: 480
}
thumbnails {
url: "https://i.ytimg.com/vi/LA6szWzus0g/hq720.jpg?sqp=-oaymwEcCK4FEIIDSEbyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDvGWQtBtiONoEcK933xt4Aypr_7w"
width: 686
height: 386
}
}
allow_ratings: true
view_count: "26531222"
author: "Google Chrome"
is_private: false
is_unplugged_corpus: false
is_live_content: false
}
一些hook的核心的类
youtubeDylib/Logos/youtubeReqResp.xm
/*
File: youtubeReqResp.xm
Function: Youtube hook request and response related
*/
#import <UIKit/UIKit.h>
#import <objc/objc-runtime.h>
#import "CrifanLibiOS.h"
#import "youtubeCommon.h"
/*------------------------------------------------------------------------------
NSURLRequest
------------------------------------------------------------------------------*/
%hook NSURLRequest
+ (NSURLRequest*)requestWithURL:(NSURL *)URL{
NSURLRequest* rwu = %orig;
if (isYoutubeAdsVideo_current(URL)){
iosLogInfo("isYoutubeAdsVideo_current: %@ -> rwu=%@", URL, rwu);
gNoUse = 1;
}
return rwu;
}
- (NSURLRequest*)initWithURL:(NSURL *)URL{
NSURLRequest* iwu = %orig;
if (isYoutubeAdsVideo_current(URL)){
iosLogInfo("isYoutubeAdsVideo_current: %@ -> iwu=%@", URL, iwu);
gNoUse = 1;
}
return iwu;
}
+ (NSURLRequest*)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval{
NSURLRequest* rwu_uct = %orig;
iosLogInfo("URL=%@,cachePolicy=%lu,timeoutInterval=%f -> rwu_uct=%@", URL, (unsigned long)cachePolicy, timeoutInterval, rwu_uct);
if (is1SecondVideo(URL)){
iosLogInfo("URL=%@", URL);
gNoUse = 1;
}
if (isYoutubeAdsVideo_current(URL)){
gNoUse = 1;
}
return rwu_uct;
}
- (NSURLRequest*)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval{
NSURLRequest* iwu_uct = %orig;
if (isYoutubeAdsVideo_current(URL)){
iosLogInfo("isYoutubeAdsVideo_current: URL=%@,cachePolicy=%lu,timeoutInterval=%f -> iwu_uct=%@", URL, (unsigned long)cachePolicy, timeoutInterval, iwu_uct);
gNoUse = 1;
}
return iwu_uct;
}
%end
/*------------------------------------------------------------------------------
NSMutableURLRequest
------------------------------------------------------------------------------*/
%hook NSMutableURLRequest
- (void)setHTTPBody: (NSData*)newHttpBodyData {
NSURL *reqUrl = [self URL];
if (isYoutubeAdsVideo_current(reqUrl)){
iosLogInfo("isYoutubeAdsVideo_current: reqUrl=%@", reqUrl);
gNoUse = 1;
}
%orig;
}
%end
/*------------------------------------------------------------------------------
NSHTTPURLResponse
------------------------------------------------------------------------------*/
%hook NSHTTPURLResponse
- (NSHTTPURLResponse*)initWithURL:(NSURL *)url
statusCode:(NSInteger)statusCode
HTTPVersion:(NSString *)HTTPVersion
headerFields:(NSDictionary<NSString *,NSString *> *)headerFields{
NSHTTPURLResponse* newUrlResp = %orig;
if (is1SecondVideo(url)){
iosLogInfo("url=%@", url);
gNoUse = 1;
}
if (isYoutubeAdsVideo_current(url)){
iosLogInfo("isYoutubeAdsVideo_current: url=%@,statusCode=%ld,HTTPVersion=%@,headerFields=%@ -> newUrlResp=%@", url, statusCode, HTTPVersion, headerFields, newUrlResp);
gNoUse = 1;
if (isYoutubeAdsVideo_ctierA(url)){
iosLogInfo("isYoutubeAdsVideo_ctierA: url=%@,statusCode=%ld,HTTPVersion=%@,headerFields=%@ -> newUrlResp=%@", url, statusCode, HTTPVersion, headerFields, newUrlResp);
gNoUse = 1;
}
} else {
// TODO: after test, change back to ads video filter
iosLogInfo("url=%@", url);
gNoUse = 1;
}
return newUrlResp;
}
-(NSDictionary *)allHeaderFields{
NSURL* curUrl = [self URL];
if (isYoutubeAdsVideo_current(curUrl)){
// iosLogInfo("isYoutubeAdsVideo: self=%@", self);
gNoUse = 1;
}
NSDictionary* allHeader = %orig;
iosLogInfo("curUrl=%@ : allHeader=%@", curUrl, allHeader);
return allHeader;
}
-(NSInteger)statusCode{
NSURL* curUrl = [self URL];
if (isYoutubeAdsVideo_current(curUrl)){
// iosLogInfo("isYoutubeAdsVideo: self=%@", self);
gNoUse = 1;
}
NSInteger respStatusCode = %orig;
iosLogInfo("respStatusCode=%ld", respStatusCode);
return respStatusCode;
}
%end
/*------------------------------------------------------------------------------
HAMDataLoadRequest
------------------------------------------------------------------------------*/
%hook HAMDataLoadRequest
- (id)initWithRangedURL:(id)rangeUrl timeoutInterval:(double)timeoutInterval HTTPMethod:(NSString*)HTTPMethod HTTPContentType:(NSString*)HTTPContentType HTTPBody:(id)HTTPBody idempotent:(_Bool)idempotent{
iosLogInfo("rangeUrl=%@,timeoutInterval=%f,HTTPMethod=%@,HTTPContentType=%@,HTTPBody=%@,idempotent=%s", rangeUrl, timeoutInterval, HTTPMethod, HTTPContentType, HTTPBody, boolToStr(idempotent));
gNoUse = 1;
id newDataLoadReq = %orig;
return newDataLoadReq;
}
- (id)initWithRangedURL:(id)rangeUrl{
iosLogInfo("rangeUrl=%@", rangeUrl);
gNoUse = 1;
id newDataLoadReq = %orig;
return newDataLoadReq;
}
- (id)initWithURL:(id)url{
iosLogInfo("url=%@", url);
gNoUse = 1;
id newDataLoadReq = %orig;
return newDataLoadReq;
}
%end
/*------------------------------------------------------------------------------
MLOnesieRequestFactory
------------------------------------------------------------------------------*/
%hook MLOnesieRequestFactory
- (id)onesieRequestForPlayerRequest:(id)request dataLoader:(id)dataLoader context:(id)context cryptor:(id)cryptor requestNumber:(long long)requestNumber error:(id *)error{
iosLogInfo("request=%@,dataLoader=%@,context=%@,cryptor=%@,requestNumber=%lld,error=%p", request, dataLoader, context, cryptor, requestNumber, error);
gNoUse = 1;
id newReqFactory = %orig;
iosLogInfo("-> newReqFactory=%@", newReqFactory);
return newReqFactory;
}
- (void)onesieRequestForPlayerRequest:(id)request authorization:(id)authorization dataLoader:(id)dataLoader context:(id)context cryptor:(id)cryptor requestNumber:(long long)requestNumber completionHandler:(id)completionHandler{
iosLogInfo("request=%@,authorization=%@,dataLoader=%@,context=%@,cryptor=%@,requestNumber=%lld,completionHandler=%@", request, authorization, dataLoader, context, cryptor, requestNumber, completionHandler);
gNoUse = 1;
%orig;
}
%end
/*------------------------------------------------------------------------------
YTIInnerTubeContext
------------------------------------------------------------------------------*/
%hook YTIInnerTubeContext
- (id)data{
id ctxData = %orig;
iosLogInfo("ctxData=%@", ctxData);
return ctxData;
}
+ (id)descriptor{
gNoUse = 1;
id curDesc = %orig;
iosLogInfo("curDesc=%@", curDesc);
return curDesc;
}
-(YTIClientInfo*)remoteClient{
gNoUse = 1;
YTIClientInfo* newClientInfo = %orig;
iosLogInfo("newClientInfo=%@", newClientInfo);
return newClientInfo;
}
%end
/*------------------------------------------------------------------------------
YTPlayerService
------------------------------------------------------------------------------*/
%hook YTPlayerService
- (id)makePlaybackRequest:(id)playbackRequest responseBlock:(id)responseBlock errorBlock:(id)errorBlock{
iosLogInfo("playbackRequest=%@,responseBlock=%@,errorBlock=%@", playbackRequest, responseBlock, errorBlock);
gNoUse = 1;
id newPlayService = %orig;
iosLogInfo("-> newPlayService=%@", newPlayService);
return newPlayService;
}
%end
/*------------------------------------------------------------------------------
YTPlayerRequestFactory
------------------------------------------------------------------------------*/
%hook YTPlayerRequestFactory
- (id)requestForPlayerWithPlayerRequest:(id)playerRequest URLRequestProperties:(id)URLRequestProperties{
iosLogInfo("playerRequest=%@,URLRequestProperties=%@", playerRequest, URLRequestProperties);
gNoUse = 1;
id newReqFactory = %orig;
iosLogInfo("-> newReqFactory=%@", newReqFactory);
return newReqFactory;
}
- (id)innerTubeRequestForPlayerWithVideoID:(id)videoID playlistID:(id)playlistID playlistIndex:(unsigned long long)playlistIndex playbackContext:(id)playbackContext forOffline:(_Bool)forOffline clickTrackingParams:(id)clickTrackingParams playerParams:(id)playerParams{
iosLogInfo("videoID=%@,playlistID=%@,playlistIndex=%lld,playbackContext=%@,forOffline=%s,clickTrackingParams=%@,playerParams=%@", videoID, playlistID, playlistIndex, playbackContext, boolToStr(forOffline), clickTrackingParams, playerParams);
gNoUse = 1;
id newPlayerReqFactory = %orig;
iosLogInfo("-> newPlayerReqFactory=%@", newPlayerReqFactory);
return newPlayerReqFactory;
}
%end
/*------------------------------------------------------------------------------
YTPlaybackDataLoader
------------------------------------------------------------------------------*/
%hook YTPlaybackDataLoader
- (id)onlinePromise{
iosLogInfo("%s", "");
gNoUse = 1;
id newPromise = %orig;
iosLogInfo("-> newPromise=%@", newPromise);
return newPromise;
}
- (id)createPlaybackRequest{
iosLogInfo("%s", "");
gNoUse = 1;
id newReq = %orig;
iosLogInfo("-> newReq=%@", newReq);
return newReq;
}
%end
/*------------------------------------------------------------------------------
YTPlaybackRequestFactory
------------------------------------------------------------------------------*/
%hook YTPlaybackRequestFactory
- (id)playbackRequestForPlayerTransition:(id)playerTransition visibility:(int)visibility viewportSizeProvider:(id)viewportSizeProvider mediaStickySettings:(id)mediaStickySettings prefetchContext:(id)prefetchContext{
iosLogInfo("playerTransition=%@,visibility=%d,viewportSizeProvider=%@,mediaStickySettings=%@,prefetchContext=%@", playerTransition, visibility, viewportSizeProvider, mediaStickySettings, prefetchContext);
gNoUse = 1;
id newPlaybackReqFactory = %orig;
iosLogInfo("-> newPlaybackReqFactory=%@", newPlaybackReqFactory);
return newPlaybackReqFactory;
}
%end
/*------------------------------------------------------------------------------
GPBMessage
------------------------------------------------------------------------------*/
%hook GPBMessage
- (id)data{
gNoUse = 1;
id neGpbwData = %orig;
iosLogInfo("-> neGpbwData=%@", neGpbwData);
return neGpbwData;
}
%end
/*------------------------------------------------------------------------------
YTAccountScopedInnerTubeRequestFactory
------------------------------------------------------------------------------*/
%hook YTAccountScopedInnerTubeRequestFactory
- (id)requestForProtoRequest:(id)protoRequest withService:(long long)serviceNumber needsClickTrackingParams:(_Bool)needsClickTrackingParams{
iosLogInfo("protoRequest=%@,serviceNumber=%lld,needsClickTrackingParams=%s", protoRequest, serviceNumber, boolToStr(needsClickTrackingParams));
if (ServiceNumber_AdBreak == serviceNumber){
iosLogInfo("is ServiceNumber_AdBreak: %lld", serviceNumber);
gNoUse = 1;
}
id newRequest = %orig;
return newRequest;
}
%end
/*------------------------------------------------------------------------------
YTPlayerBytesSlotFulfillmentAdapter
------------------------------------------------------------------------------*/
%hook YTPlayerBytesSlotFulfillmentAdapter
- (void)fillSlot{
iosLogInfo("%s", "");
%orig;
}
%end
/*------------------------------------------------------------------------------
YTAdBreakMetadataProvider
------------------------------------------------------------------------------*/
%hook YTAdBreakMetadataProvider
+ (id)dataFromMetadata:(id)metadata{
id data = %orig;
iosLogInfo("metadata=%@ -> data=%@", metadata, data);
return data;
}
%end
/*------------------------------------------------------------------------------
YTAdClientMetadataAbstractProvider
------------------------------------------------------------------------------*/
%hook YTAdClientMetadataAbstractProvider
+ (id)tagName{
id curTagName = %orig;
iosLogInfo("curTagName=%@", curTagName);
return curTagName;
}
%end
/*------------------------------------------------------------------------------
YTAdClientMetadata
------------------------------------------------------------------------------*/
%hook YTAdClientMetadata
- (id)metadataProviderForProviderName:(id)providerName{
id metadataProvider = %orig;
iosLogInfo("providerName=%@ -> metadataProvider=%@", providerName, metadataProvider);
return metadataProvider;
}
%end
一些核心的类的IDA伪代码
-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]
HAMCronetDataLoadTask_startWithDelegate_delegateQueue.coffee
void __cdecl -[HAMCronetDataLoadTask startWithDelegate:delegateQueue:](HAMCronetDataLoadTask *self, SEL a2, id inputDelegate, id inputDispatchQueue)
{
struct objc_object *dispatchQueue; // x21
struct objc_object *curDelegate; // x20
HAMCronetDataLoadTask *curHAMCronetDataLoadTask; // x27
struct objc_object *dispatchQueue_; // x23
double absoluteTime; // d0
__int64 CronetDataLoadTask; // x19
NSURLRequest *request; // x28
double timeoutInterval; // d8
NSDictionary *userInfo; // x26
struct objc_object *clock; // x24
Cronet_Engine *engine; // ST30_8
id request_; // x20
id clock_; // x22
HAMCronetDataLoadTask *curHAMCronetDataLoadTask_; // x25
OS_dispatch_queue **v18; // x27
__int64 v19; // x0
Cronet_UrlRequestCallback *cronetUrlRequestCallback; // x21
id clock__; // x0
CronetDataLoadTask *CronetDataLoadTask_; // x22
double clockAbsoluteTime; // d0
struct objc_object *v24; // x0
HAMDataLoadTaskObserver *MLHAMDataLoadTaskObserverImpl; // x0
struct objc_object *v26; // x8
Cronet_Executor *Cronet_ExecutorPtr; // x0
void *Cronet_UrlRequestParamsPtr; // x19
struct objc_object *v29; // x0
NSString *httpMethod; // x28
NSString *requestMethod_1; // x0
char *requestMethodStr; // x0
struct objc_object *v33; // x0
id allHTTPHeaderFields; // x21
struct objc_object *v35; // x0
id HTTPBody; // x21
Cronet_UploadDataProvider *Cronet_UploadDataProviderPtr; // x0
struct objc_object *v38; // x0
id v39; // x0
struct objc_object *requestUrl; // x24
struct objc_object *v41; // x0
struct objc_object *requestUrlNSString; // x26
Cronet_Executor *v43; // x5
int Cronet_RESULT_InitWithParams; // w26
OS_dispatch_queue *v45; // x0
void (__fastcall *blockInvokeFunc)(__int64); // x8
struct objc_object *inputDelegate_1; // x19
struct objc_object *userInfo_1; // x23
struct objc_object *dispatchQueue_2; // x24
int Cronet_RESULT_Start; // w0
id dispatchQueue_1; // [xsp+8h] [xbp-F8h]
id userInfo_; // [xsp+10h] [xbp-F0h]
id inputDelegate_; // [xsp+18h] [xbp-E8h]
BOOL idempotent; // [xsp+2Ch] [xbp-D4h]
struct objc_object *object; // [xsp+38h] [xbp-C8h]
void **stackBlock; // [xsp+40h] [xbp-C0h]
InternalMetadata v57; // [xsp+48h] [xbp-B8h]
HasBits<1> v58[2]; // [xsp+50h] [xbp-B0h]
void *v59; // [xsp+58h] [xbp-A8h]
CronetDataLoadTask *v60; // [xsp+60h] [xbp-A0h]
int v61; // [xsp+68h] [xbp-98h]
void **globalBlock; // [xsp+70h] [xbp-90h]
__int64 blockFlags; // [xsp+78h] [xbp-88h]
void (__fastcall *blockInvoke)(__int64, struct objc_object *, struct objc_object *); // [xsp+80h] [xbp-80h]
void **blockDescriptor; // [xsp+88h] [xbp-78h]
void *v66; // [xsp+90h] [xbp-70h]
dispatchQueue = inputDispatchQueue;
curDelegate = inputDelegate;
curHAMCronetDataLoadTask = self;
inputDelegate_ = objc_retain(inputDelegate);
dispatchQueue_ = objc_retain(dispatchQueue);
objc_msgSend_3E84298((void *)curHAMCronetDataLoadTask->_clock, "absoluteTime");
curHAMCronetDataLoadTask->_startTime = absoluteTime;
CronetDataLoadTask = (__int64)&curHAMCronetDataLoadTask->_task;
objc_storeStrong((id *)&curHAMCronetDataLoadTask->_task.delegate_, curDelegate);
request = curHAMCronetDataLoadTask->_request;
timeoutInterval = curHAMCronetDataLoadTask->_timeoutInterval;
idempotent = curHAMCronetDataLoadTask->_idempotent;
userInfo = curHAMCronetDataLoadTask->_userInfo;
clock = (struct objc_object *)curHAMCronetDataLoadTask->_clock;
engine = curHAMCronetDataLoadTask->_engine;
request_ = objc_retain((id)curHAMCronetDataLoadTask->_request);
userInfo_ = objc_retain((id)userInfo);
clock_ = objc_retain(clock);
curHAMCronetDataLoadTask_ = (HAMCronetDataLoadTask *)objc_retain((id)curHAMCronetDataLoadTask);
dispatchQueue_1 = objc_retain(dispatchQueue_);
objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.parentTask_, (id)curHAMCronetDataLoadTask);
objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.URLRequest_, (id)request);
curHAMCronetDataLoadTask_->_task.timeoutInterval_ = timeoutInterval;
objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.userInfo_, (id)userInfo);
objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.clock_, clock);
v18 = &curHAMCronetDataLoadTask_->_task.queue_;
objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.queue_, dispatchQueue);
curHAMCronetDataLoadTask_->_task.request_ = (Cronet_UrlRequest *)sub_3DF6D08(v19);
cronetUrlRequestCallback = (Cronet_UrlRequestCallback *)mallocAndSetResponseCallbacks_3DF91D8(
(__int64)Cronet_UrlRequestCallback_OnRedirectReceived_194C9D8,
(__int64)Cronet_UrlRequestCallback_OnResponseStarted_194CCE4,
(__int64)Cronet_UrlRequestCallback_OnReadCompleted_194CFE8,
(__int64)Cronet_UrlRequestCallback_OnSucceeded_194D248,
(__int64)Cronet_UrlRequestCallback_OnFailed_194D310,
(__int64)Cronet_UrlRequestCallback_OnCanceled_194D5C0);
setOffest8Value_3DF9198((__int64)cronetUrlRequestCallback, CronetDataLoadTask);
curHAMCronetDataLoadTask_->_task.callback_ = cronetUrlRequestCallback;
object = clock_;
clock__ = clock_;
CronetDataLoadTask_ = (CronetDataLoadTask *)CronetDataLoadTask;
objc_msgSend_3E84298(clock__, "absoluteTime");
curHAMCronetDataLoadTask_->_task.absoluteTime_ = clockAbsoluteTime;
v24 = (struct objc_object *)InjectOptionalHAMDataLoadTaskObserver();
MLHAMDataLoadTaskObserverImpl = (HAMDataLoadTaskObserver *)objc_retainAutoreleasedReturnValue_3E842EC(v24);
v26 = (struct objc_object *)curHAMCronetDataLoadTask_->_task.observer_;
curHAMCronetDataLoadTask_->_task.observer_ = MLHAMDataLoadTaskObserverImpl;
objc_release_3E842BC(v26);
objc_msgSend_3E84298(
(void *)curHAMCronetDataLoadTask_->_task.observer_,
"dataLoadTaskDidStart:",
curHAMCronetDataLoadTask_);
Cronet_ExecutorPtr = (Cronet_Executor *)Cronet_Executor_CreateWith_3DF9004(Cronet_Executor_ExecuteFunc_194C27C);
curHAMCronetDataLoadTask_->_task.executor_ = Cronet_ExecutorPtr;
setOffest8Value_3DF8FF8((__int64)Cronet_ExecutorPtr, CronetDataLoadTask);
Cronet_UrlRequestParamsPtr = (void *)Cronet_UrlRequestParams_Create_3DFA39C();
v29 = (struct objc_object *)objc_msgSend_3E84298(request_, "HTTPMethod");
httpMethod = (NSString *)objc_retainAutoreleasedReturnValue_3E842EC(v29);
if ( httpMethod )
{
requestMethod_1 = (NSString *)objc_retainAutorelease_3E842D4();
requestMethodStr = (char *)objc_msgSend_3E84298(requestMethod_1, "UTF8String");
Cronet_UrlRequestParams_http_method_set_3DFA3D0((__int64)Cronet_UrlRequestParamsPtr, (__int64)requestMethodStr);
}
if ( idempotent )
Cronet_UrlRequestParams_idempotency_set_3DFA45C((__int64)Cronet_UrlRequestParamsPtr, 1);// 1=Cronet_UrlRequestParams_IDEMPOTENCY_IDEMPOTENT
v33 = (struct objc_object *)objc_msgSend_3E84298(request_, "allHTTPHeaderFields");
allHTTPHeaderFields = objc_retainAutoreleasedReturnValue_3E842EC(v33);
globalBlock = _NSConcreteGlobalBlock;
blockFlags = 0xD0800000LL;
blockInvoke = cornetAddHeader_194C2FC;
blockDescriptor = (void **)&unk_4EF9AF8;
v66 = Cronet_UrlRequestParamsPtr;
objc_msgSend_3E84298(allHTTPHeaderFields, "enumerateKeysAndObjectsUsingBlock:", &globalBlock);
objc_release_3E842BC(allHTTPHeaderFields);
v35 = (struct objc_object *)objc_msgSend_3E84298(request_, "HTTPBody");
HTTPBody = objc_retainAutoreleasedReturnValue_3E842EC(v35);
if ( objc_msgSend_3E84298(HTTPBody, "length") )
{
Cronet_UploadDataProviderPtr = (Cronet_UploadDataProvider *)Cronet_UploadDataProvider_CreateWith_3DF92E0(
(__int64)Cronet_UploadDataProvider_GetLengthFunc_194C3C4,
(__int64)Cronet_UploadDataProvider_ReadFunc_194C418,
(__int64)Cronet_UploadDataProvider_RewindFunc_194C4F4,
(__int64)Cronet_UploadDataProvider_CloseFunc_194C51C);
curHAMCronetDataLoadTask_->_task.uploadDataProvider_ = Cronet_UploadDataProviderPtr;
setOffest8Value_3DF92A0((__int64)Cronet_UploadDataProviderPtr, (__int64)CronetDataLoadTask_);
Cronet_UrlRequestParams_upload_data_provider_set_3DFA3EC(
(__int64)Cronet_UrlRequestParamsPtr,
(__int64)curHAMCronetDataLoadTask_->_task.uploadDataProvider_);
Cronet_UrlRequestParams_upload_data_provider_executor_set_3DFA3F4(
(__int64)Cronet_UrlRequestParamsPtr,
(__int64)curHAMCronetDataLoadTask_->_task.executor_);
}
v38 = (struct objc_object *)objc_msgSend_3E84298(request_, "URL");
v39 = objc_retainAutoreleasedReturnValue_3E842EC(v38);
requestUrl = v39;
v41 = (struct objc_object *)objc_msgSend_3E84298(v39, "absoluteString");
objc_retainAutoreleasedReturnValue_3E842EC(v41);
requestUrlNSString = (struct objc_object *)objc_retainAutorelease_3E842D4();
objc_msgSend_3E84298(requestUrlNSString, "cStringUsingEncoding:", 4LL);
objc_release_3E842BC(requestUrlNSString);
objc_release_3E842BC(requestUrl);
v43 = curHAMCronetDataLoadTask_->_task.executor_;
Cronet_RESULT_InitWithParams = Cronet_UrlRequest_InitWithParams_3DF931C((__int64)curHAMCronetDataLoadTask_->_task.request_);
Cronet_UrlRequestParams_Destroy_3DFA3B8(Cronet_UrlRequestParamsPtr);
if ( Cronet_RESULT_InitWithParams )
{
v45 = *v18;
stackBlock = _NSConcreteStackBlock;
blockInvokeFunc = InitWithParamsErrorCallback_194C520;
userInfo_1 = userInfo_;
inputDelegate_1 = inputDelegate_;
dispatchQueue_2 = dispatchQueue_1;
LABEL_11:
v57.var0 = 0xC0000000LL;
*(_QWORD *)v58[0].var0 = blockInvokeFunc;
v59 = &unk_4EF9B18;
v60 = CronetDataLoadTask_;
v61 = Cronet_RESULT_InitWithParams;
dispatch_async(v45, &stackBlock);
goto LABEL_12;
}
tryResetTimeoutTimer_194C704(CronetDataLoadTask_);
Cronet_RESULT_Start = callCronetUrlRequestStart_3DF9338((__int64)curHAMCronetDataLoadTask_->_task.request_);
userInfo_1 = userInfo_;
inputDelegate_1 = inputDelegate_;
dispatchQueue_2 = dispatchQueue_1;
if ( Cronet_RESULT_Start )
{
Cronet_RESULT_InitWithParams = Cronet_RESULT_Start;
v45 = *v18;
stackBlock = _NSConcreteStackBlock;
blockInvokeFunc = startErrorCallback_194C7FC;
goto LABEL_11;
}
LABEL_12:
objc_release_3E842BC(HTTPBody);
objc_release_3E842BC((id)httpMethod);
objc_release_3E842BC(dispatchQueue_2);
objc_release_3E842BC((id)curHAMCronetDataLoadTask_);
objc_release_3E842BC(object);
objc_release_3E842BC(userInfo_1);
objc_release_3E842BC(request_);
objc_release_3E842BC(dispatchQueue_2);
objc_release_3E842BC(inputDelegate_1);
}
广告过滤内部调用逻辑,涉及到多个函数多个参数:
disable_ads_filter_logic.coffee
禁用广告过滤时,多次调试
目前的发现的逻辑是:
---
【1】即使是 oad 的 initplayback ,正常返回response,也会返回错误
(1) case 1:
请求:
NSURLRequest requestWithURL:cachePolicy:timeoutInterval
URL=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
cachePolicy=0
timeoutInterval=60.000000
响应:
NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
url=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
statusCode=200
HTTPVersion=(null)
headerFields={
"alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
"cache-control" = "public, max-age=86400";
"client-protocol" = quic;
"content-type" = "application/vnd.yt-ump";
"cross-origin-resource-policy" = "cross-origin";
date = "Tue, 12 Jul 2022 01:52:01 GMT";
expires = "Wed, 13 Jul 2022 01:52:01 GMT";
server = "gvs 1.0";
vary = Origin;
"x-content-type-options" = nosniff;
}
但还是会报错:
NSError errorWithDomain:code:userInfo:
errDomain=com.google.ios.hamplayer
code=6000
userInfo={
HAMErrorDetails = "cronet=10|internal=-356|quic=85";
HAMErrorURLRequest = "<NSMutableURLRequest: 0x282833ae0>
{
URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
}";
HAMRequestNumberLoadTaskKey = 1;
}
以及:
NSError ml_mediaErrorWithCode:underlyingError:
arg1=708
underlyingError=
Error Domain=com.google.ios.hamplayer
Code=6000 "(null)"
UserInfo={
HAMErrorDetails=cronet=10|internal=-356|quic=85
HAMRequestNumberLoadTaskKey=1
HAMErrorURLRequest=<NSMutableURLRequest: 0x282833ae0>
{
URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140 }} -> mmewc=Error Domain=YTMediaError Code=708 "(null)" UserInfo={NSUnderlyingError=0x283bda940 {Error Domain=com.google.ios.hamplayer Code=6000 "(null)" UserInfo={HAMErrorDetails=cronet=10|internal=-356|quic=85, HAMRequestNumberLoadTaskKey=1, HAMErrorURLRequest=<NSMutableURLRequest: 0x282833ae0> { URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
}
}
(2) case 2:
NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
URL=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
cachePolicy=0
timeoutInterval=60.000000
响应:
NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
url=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
statusCode=200
HTTPVersion=(null)
headerFields={
"alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
"cache-control" = "public, max-age=86400";
"client-protocol" = quic;
"content-type" = "application/vnd.yt-ump";
"cross-origin-resource-policy" = "cross-origin";
date = "Tue, 12 Jul 2022 02:00:07 GMT";
expires = "Wed, 13 Jul 2022 02:00:07 GMT";
server = "gvs 1.0";
vary = Origin;
"x-content-type-options" = nosniff;
}
也还是会报错:
NSError errorWithDomain:code:userInfo:
errDomain=com.google.ios.hamplayer
code=6000
userInfo={
HAMErrorDetails = "cronet=10|internal=-356|quic=85";
HAMErrorURLRequest = "<NSMutableURLRequest: 0x2828fc1b0> {
URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
}";
HAMRequestNumberLoadTaskKey = 1;
}
以及:
NSError HAMErrorWithCode:userInfo:
reqUrl=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
以及:
NSError ml_mediaErrorWithCode:underlyingError:
arg1=708
underlyingError=
Error Domain=com.google.ios.hamplayer
Code=6000 "(null)"
UserInfo={
HAMErrorDetails=cronet=10|internal=-356|quic=85
HAMRequestNumberLoadTaskKey=1
HAMErrorURLRequest=<NSMutableURLRequest: 0x2828fc1b0> {
URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
}
}
【2】即使是 ctier=L 的 videoplayback,在 前几次请求(rn=1、rn=2等)时,正常返回response,也会报错
(1) rn=1 的 ctier=L
NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
URL=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=1
cachePolicy=0
timeoutInterval=60.000000
也还是会报错:
NSError errorWithDomain:code:userInfo:
reqUrl=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=1
以及:
NSError HAMErrorWithCode:userInfo:
reqUrl=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=1
(2) rn=2 的 ctier=L
正常响应,但也报错:
NSHTTPURLResponse initWithURL:statusCode:HTTPVersionLheaderFields:
url=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=2
statusCode=200
HTTPVersion=(null)
headerFields={
"alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
"cache-control" = "private, max-age=21041";
"client-protocol" = quic;
"content-type" = "application/vnd.yt-ump";
"cross-origin-resource-policy" = "cross-origin";
date = "Tue, 12 Jul 2022 02:14:24 GMT";
expires = "Tue, 12 Jul 2022 02:14:24 GMT";
server = "gvs 1.0";
vary = Origin;
"x-content-type-options" = nosniff;
}
但也会报错:
NSError errorWithDomain:code:userInfo:
【3】当 rn=2 或 rn=3 时的 ctier=L 就正常了,不报错了,能正常返回数据了
(1) rn=3 的 ctier=L
NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
URL=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=3
cachePolicy=0
timeoutInterval=60.000000
响应:
NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
url=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=3
statusCode=200
HTTPVersion=(null)
headerFields={
"alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
"cache-control" = "private, max-age=20802";
"client-protocol" = quic;
"content-type" = "application/vnd.yt-ump";
"cross-origin-resource-policy" = "cross-origin";
date = "Tue, 12 Jul 2022 02:18:23 GMT";
expires = "Tue, 12 Jul 2022 02:18:23 GMT";
server = "gvs 1.0";
vary = Origin;
"x-content-type-options" = nosniff;
}
(2) rn=2 的 ctier=L,且能正常返回视频数据chunks
MLServerABRLoader dataLoadTask:didReceiveResponse:
arg1=<MLServerABRDataLoadTask: 0x285a0bb70>
didReceiveResponse=<NSHTTPURLResponse: 0x280dae440>
{
URL: https://rr1---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657615602&ei=kuDMYrOaBpHDigT5y4LYDw&ip=162.253.45.206&id=o-AMkZiBzQ6p7kCJW94A6DtyMGG3HfqwKg1KnZ-fNzwp2U&source=youtube&requiressl=yes&mh=Mk&mm=31,29&mn=sn-phvo-jpql,sn-vgqsknsk&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=22&ctier=L&initcwndbps=1266250&svpuc=1&sabr=1&mt=1657593666&fvip=4&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgAqEYZlR2jQz3cDKbLMWJKMhZa_JyTS1vtd_9O64WLDkCIQDfL32Gx3XA9C4XUvNdiiXvM8TQjClSjAv2N0B2bt-flw%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRgIhAJ8F9p0MlD7yBXsonsAKJ95tApty4njmPKzuAFqoM81WAiEAlFcqzn3LXLCxMMe_WxKUJOd4L9uLrZ7oP_BtbspIFBY%3D&cpn=tuURUWDAKHN5FNX8&rn=2
}
{
Status Code: 200
Headers {
"Cache-Control" = (
"private, max-age=20896"
);
"Content-Type" = (
"application/vnd.yt-ump"
);
Date = (
"Tue, 12 Jul 2022 02:53:26 GMT"
);
Expires = (
"Tue, 12 Jul 2022 02:53:26 GMT"
);
Server = (
"gvs 1.0"
);
Vary = (
Origin
);
"alt-svc" = (
"h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\""
);
"client-protocol" = (
quic
);
"cross-origin-resource-policy" = (
"cross-origin"
);
"x-content-type-options" = (
nosniff
);
}
}
MLServerABRLoader dataLoadTask:didReceiveData:
arg1=<MLServerABRDataLoadTask: 0x285a0bb70>
didReceiveData={length = 65536, bytes = 0x235908d0 fa0610d0 fa0618e0 d4033a4b ... 4286a906 e50ad07b }
不过后续此处 rn=2 的 ctier=L 也报错了:
NSError errorWithDomain:code:userInfo:
https://rr1---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657615602&ei=kuDMYrOaBpHDigT5y4LYDw&ip=162.253.45.206&id=o-AMkZiBzQ6p7kCJW94A6DtyMGG3HfqwKg1KnZ-fNzwp2U&source=youtube&requiressl=yes&mh=Mk&mm=31,29&mn=sn-phvo-jpql,sn-vgqsknsk&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=22&ctier=L&initcwndbps=1266250&svpuc=1&sabr=1&mt=1657593666&fvip=4&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgAqEYZlR2jQz3cDKbLMWJKMhZa_JyTS1vtd_9O64WLDkCIQDfL32Gx3XA9C4XUvNdiiXvM8TQjClSjAv2N0B2bt-flw%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRgIhAJ8F9p0MlD7yBXsonsAKJ95tApty4njmPKzuAFqoM81WAiEAlFcqzn3LXLCxMMe_WxKUJOd4L9uLrZ7oP_BtbspIFBY%3D&cpn=tuURUWDAKHN5FNX8&rn=2
initplayback
发起(正常视频或广告视频的)视频数据请求的
https://rr3---sn-vgqsknek.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=553003fe2eb8727c&initcwndbps=1680000&mt=1655903589&ack=1&cpn=jcLGzlc6c8LsaaDH&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
https://redirector.googlevideo.com/initplayback?source=youtube&itag=0&pvi=0&pai=0&owc=yes&cmo=rnp%3Drr&id=0000000000002409
videoplayback
ctier=L
https://rr2---sn-a5meknsy.googlevideo.com/videoplayback?expire=1657110332&ei=3CrFYrS3B8qlkwbDk6m4Dg&ip=76.170.156.167&id=o-AN990KkuGRjkOtpS0zvkbcCippQdwVTosh4W04OICinJ&source=youtube&requiressl=yes&hcs=ir,&mh=v4&mm=31,26&mn=sn-a5meknsy,sn-q4flrnez&ms=au,onr&mv=m&mvi=2&pl=17&rmhost=rr3---sn-a5meknsy.googlevideo.com,&ctier=L&initcwndbps=2142500&svpuc=1&sabr=1&mt=1657088457&fvip=5&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIhAPXZb_XYMsCV_fhO5opM85fJbwUAdMIXGhBCYe3yDHi6AiBAwpSbmd53tjQZadmgq3rLdyX-Nd5447nkXP6NBPXNHQ%3D%3D&lsparams=hcs,mh,mm,mn,ms,mv,mvi,pl,rmhost,initcwndbps&lsig=AG3C_xAwRQIhAP22VWdWbIIxrvp9iCm3NMY8QQ4TS3UrFwJFxyxZH7C2AiAhnv2jgK4Nj0SwXmhuddVSWSRvX8iGYRtWZJsfBG03XQ%3D%3D&cpn=5ofB6P6ORRZhJUE8&rn=7&probe=1
ctier/L
https://r2---sn-q4flrnez.googlevideo.com/videoplayback/expire/1657108318/ei/_iLFYofvH72QsfIPy56rkA0/ip/76.170.156.167/id/o-AIPVOknUnDee3HugNutm3ybodjkv230I_U-FbZP3qt_k/source/youtube/requiressl/yes/mh/sw/mm/31,26/mn/sn-a5meknzs,sn-q4flrnez/ms/au,onr/mv/m/mvi/5/pl/17/ctier/L/initcwndbps/2056250/svpuc/1/sabr/1/mt/1657086303/fvip/2/keepalive/yes/fexp/24001373,24007246/c/IOS/sparams/expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr/sig/AOq0QJ8wRgIhALUv6hCXG_Dq8gwMkYfOxUAcH6KUBSZBcf6CikscQYp1AiEAkcLG_OxZHTcNs4tzkRl09AwqcVwYXQ374k3kyGOPZ-0=/lsparams/mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AG3C_xAwRAIgH8N-m_KKOvrdVXq7KWBgjV27TWKPn48MQjYw9qWlP1ACIFk-KqOBGsauP4fBIHDVfLC6w78LrlgHmuKzWXwKgVIt/cpn/vTddLlWhp7fI_1Ze/fallback_count/1/?rn=6
ad_break
iOS
https://youtubei.googleapis.com/youtubei/v1/player/ad_break?key=AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc
web
https://www.youtube.com/youtubei/v1/player/ad_break?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false
iOS逆向YouTube的话:
普通的类的逆向,相对不难
估计和欧美对于知识产权保护的比较严,有关系
毕竟针对于防破解做的很弱
有些底层的类,想要搞懂逻辑,不太容易
Cronet
的相关调用
-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]
比如:
以及涉及到protobuf
比如:
只能很艰难的,通过反推MessageLite
的vtable
定义,再加上底层调试,才或许有机会,找出真正字段的定义(暂未来得及完成)
OnesieRequestProto
等等
普通的类,容易通过GPBMessage
找出原始字段定义
但部分关键的类,还是被保护起来了:做成了lite版的protobuf类
原文地址:
https://github.com/crifa
ios教程了解:
可以加作者微信报名进微信学习交流群。
其它学习教程。