从YouTube实战了解ios逆向分析

iOS逆向YouTube概览

此处去以iOS逆向YouTube的app为例,介绍典型的iOS逆向的过程。

此处逆向YouTube的目的暂且定为,尝试搞懂YouTube广告过滤的可能性和底层涉及相关机制。

逆向YouTube过程

下面介绍,如何进行iOS逆向YouTube的过程。

砸壳ipa

在iPhone越狱后,接着去逆向iOS的YouTube。

先准备好砸壳后的ipa。

两种可能=来源:

  • 别人的

    • 【部分解决】下载16.36.4旧版本YouTube的ipa

    • 【未解决】寻找和下载16.36.4或更低版本的YouTube的ipa

    • 别人给的

    • 网上找的

  • 自己砸壳得到的

砸壳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广告拦截是否也时间重置

    • 说明:动态调试才需要,一般静态分析,不需要

    • 涉及帖子

其他相关

从AppStore中找历史版本

  • 【未解决】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万多个头文件

从YouTube实战了解ios逆向分析

3800多个头文件

从YouTube实战了解ios逆向分析

IDA分析代码逻辑

主要涉及,分别用IDA加载和分析,YouTube的2个二进制的文件:

  • YouTube

  • Module_Framework

然后分析其代码逻辑。

其中最核心用法是,找到可以的要研究的类的函数后,去Functions窗口中,通过函数名搜索函数,找到对应汇编代码,再F5查看反编译后的伪代码,尝试搞懂代码的具体逻辑。

特殊:导出IDA全部伪代码

为了更好的,全局去搜一些类、变量、字符串等,用于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

Reveal

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跳过广告相关页面的元素和类

Cycript

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

调试代码逻辑

Xcode+MonkeyDev

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

    • 比如找到了httprequestresponse的类,还要继续加过滤条件

    • 【已解决】研究YouTube逻辑:log日志打印优化每隔几次才输出

    • TODO:

    • 针对可疑的类和函数,写hook代码,加断点调试

    • 从界面元素入手,找到对应的类或父类

    • 作为后续深入研究的切入点:找类的相关头文件

    • 分析界面元素

    • 调试代码逻辑

    • 期间涉及


恢复符号表

为了动态调试 常会涉及:恢复符号表

TODO:

  • 【已解决】restore-symbol恢复YouTube的Block符号表报错:Address not found in the image

  • 【记录】YouTube恢复符号表后Xcode调试效果

  • 【已解决】给YouTube恢复符号表方便Xcode调试

  • 【记录】YouTube恢复符号表恢复出部分无效的symbol符号


Charles抓包

期间涉及:iOS的app的抓包:

TODO:

  • 【已解决】Mac用Charles抓包iPhone中YouTube视频过滤广告导致从头播放的数据包


YouTube的app内部逻辑

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

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}

YouTube广告过滤相关

hook的类

一些hook的核心的类

youtubeReqResp.xm

  • 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伪代码

一些核心的类的IDA伪代码

HAMCronetDataLoadTask

-[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

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

常见url

initplayback

  • 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
    redirector:没啥用
    https://redirector.googlevideo.com/initplayback?source=youtube&itag=0&pvi=0&pai=0&owc=yes&cmo=rnp%3Drr&id=0000000000002409

    videoplayback

    • 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

    • 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

逆向YouTube总结

iOS逆向YouTube的话:

  • 普通的类的逆向,相对不难

    • 估计和欧美对于知识产权保护的比较严,有关系

    • 毕竟针对于防破解做的很弱

  • 有些底层的类,想要搞懂逻辑,不太容易

    • Cronet的相关调用

    • -[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]

    • 比如:

  • 以及涉及到protobuf

    • 比如:

    • 只能很艰难的,通过反推MessageLitevtable定义,再加上底层调试,才或许有机会,找出真正字段的定义(暂未来得及完成)

    • OnesieRequestProto

    • 等等

    • 普通的类,容易通过GPBMessage找出原始字段定义

    • 但部分关键的类,还是被保护起来了:做成了lite版的protobuf类

原文地址:

https://github.com/crifa

ios教程了解:

从YouTube实战了解ios逆向分析

可以加作者微信报名进微信学习交流群。

从YouTube实战了解ios逆向分析

其它学习教程。

从YouTube实战了解ios逆向分析从YouTube实战了解ios逆向分析

原文始发于微信公众号(安全狗的自我修养):从YouTube实战了解ios逆向分析

版权声明:admin 发表于 2022年11月25日 上午8:17。
转载请注明:从YouTube实战了解ios逆向分析 | CTF导航

相关文章

暂无评论

暂无评论...