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