build-ipa/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.m
2025-11-05 09:59:50 +08:00

1159 lines
33 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// test.m
// wallpaper_project
//
// Created by 忆海16 on 2024/8/2.
//
#import "initializationTopOn.h"
#import <AnyThinkSDK/AnyThinkSDK.h>
#import <objc/runtime.h>
#import <PTFakeTouch/PTFakeTouch.h>
//#import <PAGWKWebView.h>
@interface initializationTopOn ()
@end
@implementation initializationTopOn
//CC336043-9320-4D6F-9702-E839D80ACF87
+(void)toponeSDK:(NSString*) appId appKey:(NSString*) appKey {
[ATAPI setLogEnabled:YES];//Turn on debug logs
NSError *err;
[[ATAPI sharedInstance] startWithAppID:appId appKey:appKey error:&err];
if (err) {
NSLog(@"XS- init ad err:%@",err);
NSString *err1 = [NSString stringWithFormat:@"XS- init ad err: %@", err];
NSDictionary *userInfo = @{@"text": err1};
[[NSNotificationCenter defaultCenter] postNotificationName:@"adinfo" object:nil userInfo:userInfo];
}else{
NSLog(@"XS- init ad ok");
NSDictionary *userInfo = @{@"text": @"初始化成功"};
[[NSNotificationCenter defaultCenter] postNotificationName:@"adinfo" object:nil userInfo:userInfo];
// YL_NetWorkManager().requestRemoteIp()
}
}
//+ (void)closeADWindow {
// NSLog(@"已经执行closeADWindow.....");
// UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// [keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// UIViewController *vc = obj.subviews.firstObject.nextResponder;
// if ([vc isKindOfClass:[NSClassFromString(@"MTGVideoBaseViewController") class]]) {
//
// if ([vc respondsToSelector:@selector(closeButtonTappedAction:)]) {
// NSLog(@"执行了skipVideo.....");
// [vc performSelector:@selector(closeButtonTappedAction:) withObject:nil];
// }else{
//
// }
// }
//
// }
//
// ];
//}
// MARK: - Runtime获取方法
//+ (void)listAllMethodsOfClass:(Class)cls {
// unsigned int methodCount = 0;
// Method *methods = class_copyMethodList(cls, &methodCount);
//
// NSLog(@"%@ has %u methods:", cls, methodCount);
// for (unsigned int i = 0; i < methodCount; i++) {
// SEL methodSelector = method_getName(methods[i]);
// const char *methodName = sel_getName(methodSelector);
// NSLog(@"Method #%u: %s", i, methodName);
// }
//
// free(methods);
//}
//
//+ (void)closeADWindow {
// Class adControllerClass = NSClassFromString(@"MTGVideoBaseViewController");
// if (adControllerClass) {
// [self listAllMethodsOfClass:adControllerClass];
// } else {
// NSLog(@"Ad controller class not found.");
// }
//}
+ (void)removeADVCByDelayTime:(NSInteger)delayTime onclose: (OnClose) onclose {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime / 1000 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[initializationTopOn removeVungleFullScreenPresenter];
[initializationTopOn closeADWindow];
[initializationTopOn removeAdViewControllers];
onclose();
});
}
+ (void)closeADWindow {
NSLog(@"Executing closeADWindow - First Pass");
[self performCloseADWindowActions];
NSLog(@"Executing closeADWindow - Second Pass");
[self performCloseADWindowActions];
}
+ (void) performCloseADWindowActions: (UIWindow *) keyWindow {
[keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
UIViewController *vc = obj.subviews.firstObject.nextResponder;
NSLog(@"XS- find Controller 2%@",vc.description);
if ([vc isKindOfClass:[NSClassFromString(@"MTGVideoBaseViewController") class]]) {
if ([vc respondsToSelector:@selector(_dismissViewControllerCompletion:)]) {
NSLog(@"执行了 _dismissViewControllerCompletion:");
[vc performSelector:@selector(_dismissViewControllerCompletion:) withObject:nil];
*stop = YES;
} else if ([vc respondsToSelector:@selector(callBackForDismiss)]) {
NSLog(@"执行了 callBackForDismiss");
[vc performSelector:@selector(callBackForDismiss)];
*stop = YES;
} else if ([vc respondsToSelector:@selector(didClose:)]) {
NSLog(@"执行了 didClose:");
[vc performSelector:@selector(didClose:) withObject:nil];
*stop = YES;
}
}
[self removeVungleFullScreenPresenter];
}];
}
+ (void)performCloseADWindowActions {
// UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// [initializationTopOn performCloseADWindowActions: keyWindow];
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) {
if(window.isKeyWindow) {
[initializationTopOn performCloseADWindowActions: window];
break;
}
}
}
//+ (void)checkCloseWindown {
// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// [initializationTopOn removeVungleFullScreenPresenter];
// [initializationTopOn closeADWindow];
//
// });
//}
+ (void)removeVungleFullScreenPresenter : (UIWindow *) keyWindow {
UIViewController *foundViewController = [self findFullScreenPresenterInViewController:keyWindow.rootViewController];
if (foundViewController) {
NSLog(@"Found FullScreenPresenter instance: %@", foundViewController);
[initializationTopOn closeViewController:foundViewController];
// 关闭或移除 FullScreenPresenter
// [self checkCloseWindown];
} else {
NSLog(@"FullScreenPresenter not found.");
}
}
+ (void)removeVungleFullScreenPresenter {
// UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// [initializationTopOn removeVungleFullScreenPresenter: keyWindow];
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) {
if(window.isKeyWindow) {
[initializationTopOn removeVungleFullScreenPresenter: window];
break;
}
}
}
+ (UIViewController *)findFullScreenPresenterInViewController:(UIViewController *)viewController {
NSLog(@"XS- find Controller 1 %@",viewController.description);
if ([viewController isKindOfClass:NSClassFromString(@"VungleAdsSDK.FullScreenPresenter")]) {
return viewController;
}
if ([viewController.description containsString:@"ISNProductViewController"]) {
NSLog(@"XS- find Controller 1 %@ ok",viewController.description);
return viewController;
}
// 递归遍历所有子控制器
for (UIViewController *childViewController in viewController.childViewControllers) {
UIViewController *foundViewController = [self findFullScreenPresenterInViewController:childViewController];
if (foundViewController) {
return foundViewController;
}
}
// 检查 presentedViewController
if (viewController.presentedViewController) {
return [self findFullScreenPresenterInViewController:viewController.presentedViewController];
}
return nil;
}
+ (void)closeViewController:(UIViewController *)viewController {
if (viewController.presentingViewController) {
// 如果是模态展示的
[viewController dismissViewControllerAnimated:YES completion:^{
NSLog(@"XS- close ad view 1");
}];
} else if (viewController.navigationController) {
// 如果在导航控制器中
[viewController.navigationController popViewControllerAnimated:YES];
NSLog(@"XS- close ad view 2");
} else {
// 其他情况,尝试从父视图移除
[viewController.view removeFromSuperview];
[viewController removeFromParentViewController];
NSLog(@"XS- close ad view 3");
}
}
+ (void)removeAdViewControllers {
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) {
if(window.isKeyWindow) {
NSArray *foundViewControllers = [self findAdViewControllersInViewController:window.rootViewController];
for (UIViewController *vc in foundViewControllers) {
NSLog(@"Found ad controller: %@", NSStringFromClass([vc class]));
[vc dismissViewControllerAnimated:YES completion:^{
NSLog(@"Ad controller dismissed: %@", NSStringFromClass([vc class]));
}];
}
break;
}
}
}
+ (NSArray<UIViewController *> *)findAdViewControllersInViewController:(UIViewController *)viewController {
NSMutableArray *foundControllers = [NSMutableArray array];
if ([self isLikelyAdViewController:viewController]) {
[foundControllers addObject:viewController];
}
// 递归遍历子控制器
for (UIViewController *childViewController in viewController.childViewControllers) {
[foundControllers addObjectsFromArray:[self findAdViewControllersInViewController:childViewController]];
}
// 检查 presentedViewController
if (viewController.presentedViewController) {
[foundControllers addObjectsFromArray:[self findAdViewControllersInViewController:viewController.presentedViewController]];
}
return foundControllers;
}
+ (BOOL)isLikelyAdViewController:(UIViewController *)viewController {
NSString *className = NSStringFromClass([viewController class]);
NSLog(@"AdViewController,%@",className);
// 广告SDK类名特征
NSArray *adPatterns = @[
@"FullScreenPresenter",
@"InterstitialController",
@"ViewController",
@"AdPresenter",
@"FullScreenAd",
@"VungleAds",
@"AdMob",
@"UnityAds"
];
// 检查类名特征
for (NSString *pattern in adPatterns) {
if ([className containsString:pattern]) {
return YES;
}
}
// 检查是否为第三方SDK且全屏展示
BOOL isThirdParty = ![className hasPrefix:@"UI"] &&
![className hasPrefix:@"_UI"] &&
![className containsString:@"Alert"];
BOOL isFullScreen = viewController.modalPresentationStyle == UIModalPresentationFullScreen ||
viewController.modalPresentationStyle == UIModalPresentationOverFullScreen;
// 检查view层级(广告通常会添加关闭按钮等)
BOOL hasCloseButton = NO;
for (UIView *subview in viewController.view.subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *)subview;
if ([button.currentTitle containsString:@"Close"] ||
[button.currentTitle containsString:@"Skip"]) {
hasCloseButton = YES;
break;
}
}
}
return isThirdParty && isFullScreen && hasCloseButton;
}
+ (void)simulateTouchAtPoint:(CGPoint)point {
// 获取可用的触摸ID
NSInteger touchId = [PTFakeMetaTouch getAvailablePointId];
// 模拟触摸开始
[PTFakeMetaTouch fakeTouchId:touchId AtPoint:point withTouchPhase:UITouchPhaseBegan];
// 延迟一小段时间后模拟触摸结束
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[PTFakeMetaTouch fakeTouchId:touchId AtPoint:point withTouchPhase:UITouchPhaseEnded];
});
}
+ (void)performRandomClick {
// 获取屏幕尺寸
CGRect screenBounds = [UIScreen mainScreen].bounds;
CGFloat screenWidth = screenBounds.size.width;
CGFloat screenHeight = screenBounds.size.height;
// 生成随机坐标(留出边距)
CGFloat margin = 50.0;
CGFloat randomX = margin + arc4random_uniform((int)(screenWidth - 2 * margin));
CGFloat randomY = margin + arc4random_uniform((int)(screenHeight - 2 * margin));
CGPoint randomPoint = CGPointMake(randomX, randomY);
NSLog(@"Random click at: (%.2f, %.2f)", randomX, randomY);
// 先显示红圈
//[self showRedCircleAtPoint:randomPoint];
// 执行模拟点击
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[initializationTopOn simulateTouchAtPoint:randomPoint];
});
}
@end
/*
@implementation CallStackHelper
+ (void)printDetailedCallStack {
void *callstack[128];
int frames = backtrace(callstack, 128);
char **symbols = backtrace_symbols(callstack, frames);
NSLog(@"=== Detailed Call Stack (%d frames) ===", frames);
for (int i = 0; i < frames; i++) {
NSString *symbol = [NSString stringWithUTF8String:symbols[i]];
// 解析符号信息
Dl_info dlinfo;
if (dladdr(callstack[i], &dlinfo)) {
NSString *fname = [NSString stringWithUTF8String:dlinfo.dli_fname];
NSString *sname = dlinfo.dli_sname ? [NSString stringWithUTF8String:dlinfo.dli_sname] : @"<unknown>";
NSLog(@"%2d: %-35s %s + %lu",
i,
[[fname lastPathComponent] UTF8String],
[sname UTF8String],
(uintptr_t)callstack[i] - (uintptr_t)dlinfo.dli_saddr);
} else {
NSLog(@"%2d: %@", i, symbol);
}
}
free(symbols);
}
+ (NSArray *)getCallStackSymbols {
void *callstack[128];
int frames = backtrace(callstack, 128);
char **symbols = backtrace_symbols(callstack, frames);
NSMutableArray *stackSymbols = [NSMutableArray array];
for (int i = 0; i < frames; i++) {
NSString *symbol = [NSString stringWithUTF8String:symbols[i]];
[stackSymbols addObject:symbol];
}
free(symbols);
return [stackSymbols copy];
}
+ (NSString *)getCallStackString {
NSArray *symbols = [self getCallStackSymbols];
return [symbols componentsJoinedByString:@"\n"];
}
@end
void post(id dic, NSString* p) {
@try {
if(dic && dic) {
NSLog(@"hook post:%@, dic:%@", p, dic);
if ([dic isKindOfClass:[NSString class]]) {
NSString *str = (NSString *)dic;
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString *path = [NSString stringWithFormat:@"%@/%@_%@", NSTemporaryDirectory(), p, [[NSUUID new] UUIDString]];
NSLog(@"Hook path:%@",path);
[data writeToFile:path atomically:YES];
} else {
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic
options:NSJSONWritingPrettyPrinted
error:&error];
NSString *path = [NSString stringWithFormat:@"%@/%@_%@", NSTemporaryDirectory(), p, [[NSUUID new] UUIDString]];
NSLog(@"Hook path:%@",path);
[jsonData writeToFile:path atomically:YES];
}
}
} @catch (NSException *exception) {
NSLog(@"XS- post exception;%@", exception);
}
}
void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector) {
NSLog(@"swizzleMethod:%@",class);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
if (!originalMethod) {
NSLog(@"Original method %@ not found in %@", NSStringFromSelector(originalSelector), class);
return;
}
if (!swizzledMethod) {
NSLog(@"Swizzled method %@ not found in %@", NSStringFromSelector(swizzledSelector), class);
return;
}
BOOL didAddMethod = class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
void swizzleClassMethod(Class class, SEL originalSelector, SEL swizzledSelector) {
NSLog(@"swizzleClassMethod:%@",class);
// 获取类方法 - 使用 class_getClassMethod 或者 class_getInstanceMethod(object_getClass(class), ...)
Method originalMethod = class_getClassMethod(class, originalSelector);
Method swizzledMethod = class_getClassMethod(class, swizzledSelector);
if (!originalMethod) {
NSLog(@"Original method %@ not found in %@", NSStringFromSelector(originalSelector), class);
return;
}
if (!swizzledMethod) {
NSLog(@"Swizzled method %@ not found in %@", NSStringFromSelector(swizzledSelector), class);
return;
}
// 注意类方法实际存储在metaclass中
Class metaclass = object_getClass(class);
BOOL didAddMethod = class_addMethod(metaclass,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(metaclass,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
@interface OMIDVungleAdSessionContext : NSObject
- (id) toJSON;
@end
@implementation OMIDVungleAdSessionContext (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDVungleAdSessionContext");
swizzleMethod([self class],
@selector(toJSON),
@selector(hook_toJSON));
});
}
- (id) hook_toJSON {
id res = [self hook_toJSON];
post(res, @"OMIDVungleAdSessionContext-hook-tojson");
return res;
}
@end
@interface OMIDMintegralAdSessionContext : NSObject
- (id) toJSON;
@end
@implementation OMIDMintegralAdSessionContext (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDMintegralAdSessionContext");
swizzleMethod([self class],
@selector(toJSON),
@selector(hook_toJSON));
});
}
- (id) hook_toJSON {
id res = [self hook_toJSON];
post(res, @"OMIDMintegralAdSessionContext-hook-tojson");
return res;
}
@end
@interface OMIDToponadAdSessionContext : NSObject
- (id) toJSON;
@end
@implementation OMIDToponadAdSessionContext (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDToponadAdSessionContext");
swizzleMethod([self class],
@selector(toJSON),
@selector(hook_toJSON));
});
}
- (id) hook_toJSON {
id res = [self hook_toJSON];
post(res, @"OMIDToponadAdSessionContext-hook-tojson");
return res;
}
@end
@interface OMIDVungleSDK : NSObject
- (id) appInfo;
@end
@implementation OMIDVungleSDK (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDVungleSDK");
swizzleMethod([self class],
@selector(appInfo),
@selector(hook_appInfo));
});
}
- (id) hook_appInfo {
id res = [self hook_appInfo];
post(res, @"OMIDVungleSDK-hook-appInfo");
return res;
}
@end
@interface OMIDMintegralSDK : NSObject
- (id) appInfo;
@end
@implementation OMIDMintegralSDK (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDMintegralSDK");
swizzleMethod([self class],
@selector(appInfo),
@selector(hook_appInfo));
});
}
- (id) hook_appInfo {
id res = [self hook_appInfo];
post(res, @"OMIDMintegralSDK-hook-appInfo");
return res;
}
@end
@interface OMIDToponadSDK : NSObject
- (id) appInfo;
@end
@implementation OMIDToponadSDK (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDMintegralSDK");
swizzleMethod([self class],
@selector(appInfo),
@selector(hook_appInfo));
});
}
- (id) hook_appInfo {
id res = [self hook_appInfo];
post(res, @"OMIDToponadSDK-hook-appInfo");
return res;
}
@end
@interface OMIDMintegralDevice : NSObject
+ (id) deviceDictionary;
@end
@implementation OMIDMintegralDevice (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDMintegralDevice");
swizzleClassMethod([self class],
@selector(deviceDictionary),
@selector(hook_deviceDictionary));
});
}
+ (id) hook_deviceDictionary {
id res = [self hook_deviceDictionary];
post(res, @"OMIDMintegralDevice-hook-deviceDictionary");
return res;
}
@end
@interface OMIDToponadDevice : NSObject
+ (id) deviceDictionary;
@end
@implementation OMIDToponadDevice (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDToponadDevice");
swizzleClassMethod([self class],
@selector(deviceDictionary),
@selector(hook_deviceDictionary));
});
}
+ (id) hook_deviceDictionary {
id res = [self hook_deviceDictionary];
post(res, @"OMIDToponadDevice-hook-deviceDictionary");
return res;
}
@end
@interface OMIDVungleDevice : NSObject
+ (id) deviceDictionary;
@end
@implementation OMIDVungleDevice (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP OMIDVungleDevice");
swizzleClassMethod([self class],
@selector(deviceDictionary),
@selector(hook_deviceDictionary));
});
}
+ (id) hook_deviceDictionary {
id res = [self hook_deviceDictionary];
post(res, @"OMIDVungleDevice-hook-deviceDictionary");
return res;
}
@end
@interface MTGDeviceInfo : NSObject
- (id) returnDeviceInfoDic;
- (NSString *) model;
- (NSString *) hardwareString;
@end
@implementation MTGDeviceInfo (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP MTGDeviceInfo");
swizzleMethod([self class],
@selector(returnDeviceInfoDic),
@selector(hook_returnDeviceInfoDic));
swizzleMethod([self class],
@selector(model),
@selector(hook_model));
swizzleMethod([self class],
@selector(hardwareString),
@selector(hook_hardwareString));
});
}
- (id) hook_returnDeviceInfoDic {
id res = [self hook_returnDeviceInfoDic];
post(res, @"MTGDeviceInfo-hook-returnDeviceInfoDic");
return res;
}
- (NSString *) hook_model {
NSString *res = [self hook_model];
post(res, @"MTGDeviceInfo-hook-model");
return res;
}
- (NSString *) hook_hardwareString {
NSString *res = [self hook_hardwareString];
post(res, @"MTGDeviceInfo-hook-hardwareString");
return res;
}
@end
@interface ATDeviceInfo : NSObject
- (id) returnDeviceInfoDic;
- (NSString *) model;
- (NSString *) hardwareString;
@end
@implementation ATDeviceInfo (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATDeviceInfo");
swizzleMethod([self class],
@selector(returnDeviceInfoDic),
@selector(hook_returnDeviceInfoDic));
swizzleMethod([self class],
@selector(model),
@selector(hook_model));
swizzleMethod([self class],
@selector(hardwareString),
@selector(hook_hardwareString));
});
}
- (id) hook_returnDeviceInfoDic {
id res = [self hook_returnDeviceInfoDic];
post(res, @"ATDeviceInfo-hook-returnDeviceInfoDic");
return res;
}
- (NSString *) hook_model {
NSString *res = [self hook_model];
post(res, @"ATDeviceInfo-hook-model");
return res;
}
- (NSString *) hook_hardwareString {
NSString *res = [self hook_hardwareString];
post(res, @"ATDeviceInfo-hook-hardwareString");
return res;
}
@end
@interface ATUtilities : NSObject
+ (NSInteger) ATTStatus;
+ (id) model;
+ (id) machine;
@end
@implementation ATUtilities (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATDeviceInfo");
swizzleClassMethod([self class],
@selector(ATTStatus),
@selector(hook_ATTStatus));
swizzleClassMethod([self class],
@selector(model),
@selector(hook_model));
swizzleClassMethod([self class],
@selector(machine),
@selector(hook_machine));
});
}
+ (NSInteger) hook_ATTStatus {
NSInteger res = [self hook_ATTStatus];
post([NSString stringWithFormat:@"%ld", res], @"ATUtilities-hook-ATTStatus");
return res;
}
+ (id) hook_model {
id res = [self hook_model];
// 打印调用堆栈
[CallStackHelper printDetailedCallStack];
post(res, @"ATUtilities-hook-model");
return res;
}
+ (id) hook_machine {
id res = [self hook_machine];
// 打印调用堆栈
[CallStackHelper printDetailedCallStack];
post(res, @"ATUtilities-hook-machine");
return res;
}
@end
@interface ATDeviceHandler : NSObject
+ (NSInteger) getAdvTrackingStatus;
@end
@implementation ATDeviceHandler (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATDeviceInfo");
swizzleClassMethod([self class],
@selector(getAdvTrackingStatus),
@selector(hook_getAdvTrackingStatus));
});
}
+ (NSInteger) hook_getAdvTrackingStatus {
NSInteger res = [self hook_getAdvTrackingStatus];
post([NSString stringWithFormat:@"%ld", res], @"ATDeviceHandler-hook-getAdvTrackingStatus");
return res;
}
@end
@interface MTGDeviceHandler : NSObject
+ (NSInteger) getAdvTrackingStatus;
@end
@implementation MTGDeviceHandler (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATDeviceInfo");
swizzleClassMethod([self class],
@selector(getAdvTrackingStatus),
@selector(hook_getAdvTrackingStatus));
});
}
+ (NSInteger) hook_getAdvTrackingStatus {
NSInteger res = [self hook_getAdvTrackingStatus];
post([NSString stringWithFormat:@"%ld", res], @"MTGDeviceHandler -hook-getAdvTrackingStatus");
return res;
}
@end
@interface MTGAFHTTPBodyPart : NSObject
- (void) setBody:(id) body;
@end
@implementation MTGAFHTTPBodyPart (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP MTGAFHTTPBodyPart");
swizzleMethod([self class],
@selector(setBody:),
@selector(hook_setBody:));
});
}
- (void) hook_setBody:(id) body {
[self hook_setBody:body];
post(body, @"MTGAFHTTPBodyPart-hook-setBody");
}
@end
@interface ATTAdManager : NSObject
- (void) setAdRequest:(id) request;
- (void) setAdRequestMaps:(id) request;
@end
@implementation ATTAdManager (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP MTGAFHTTPBodyPart");
swizzleMethod([self class],
@selector(setAdRequest:),
@selector(hook_setAdRequest:));
swizzleMethod([self class],
@selector(setAdRequestMaps:),
@selector(hook_setAdRequestMaps:));
});
}
- (void) hook_setAdRequest:(id) request {
[self hook_setAdRequest:request];
post(request, @"ATTAdManager-hook-setAdRequest");
}
- (void) hook_setAdRequestMaps:(id) request {
[self hook_setAdRequestMaps:request];
post(request, @"ATTAdManager-hook-setAdRequestMaps");
}
@end
@interface ATBaseBridgeWebView : NSObject
- (void) setRequest:(id) request;
@end
@implementation ATBaseBridgeWebView (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP MTGAFHTTPBodyPart");
swizzleMethod([self class],
@selector(setRequest:),
@selector(hook_setRequest:));
});
}
- (void) hook_setRequest:(id) request {
[self hook_setRequest:request];
post(request, @"ATBaseBridgeWebView-hook-setRequest");
}
@end
@interface ATURLResolver : NSObject
- (void) setCurrentRequest:(id) request;
@end
@implementation ATURLResolver (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP MTGAFHTTPBodyPart");
swizzleMethod([self class],
@selector(setCurrentRequest:),
@selector(hook_setCurrentRequest:));
});
}
- (void) hook_setCurrentRequest:(id) request {
[self hook_setCurrentRequest:request];
post(request, @"ATURLResolver-hook-setCurrentRequest");
}
@end
@interface ATAgentEvent : NSObject
- (void) uploadData:(id) data completion:(id) completion;
@end
@implementation ATAgentEvent (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATAgentEvent");
swizzleMethod([self class],
@selector(uploadData:completion:),
@selector(hook_uploadData:completion:));
});
}
- (void) hook_uploadData:(id) data completion:(id) completion {
[self hook_uploadData:data completion:completion];
post(data, @"ATAgentEvent-hook-hook_uploadData");
}
@end
@interface ATURLArgumentModel : NSObject
- (void) setP_argumentDic:(id) data;
- (void) setP2_argumentDic:(id) data;
@end
@implementation ATURLArgumentModel (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATURLArgumentModel");
swizzleMethod([self class],
@selector(setP_argumentDic:),
@selector(hook_setP_argumentDic:));
swizzleMethod([self class],
@selector(setP2_argumentDic:),
@selector(hook_setP2_argumentDic:));
});
}
- (void) hook_setP_argumentDic:(id) data {
[self hook_setP_argumentDic:data];
post(data, @"ATURLArgumentModel-hook_setP_argumentDic");
}
- (void) hook_setP2_argumentDic:(id) data {
[self hook_setP2_argumentDic:data];
post(data, @"ATURLArgumentModel-hook_setP2_argumentDic");
}
@end
@interface ATURLArgumentModule : NSObject
+ (id) getParametersWithPlacementModel:(id)placementModel parameterType:(UInt64) parameterType;
@end
@implementation ATURLArgumentModule (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATURLArgumentModule");
swizzleClassMethod([self class],
@selector(getParametersWithPlacementModel:parameterType:),
@selector(hook_getParametersWithPlacementModel:parameterType:));
});
}
+ (id) hook_getParametersWithPlacementModel:(id)placementModel parameterType:(UInt64) parameterType{
id data = [self hook_getParametersWithPlacementModel:placementModel parameterType:parameterType];
post(data, @"ATURLArgumentModule-hook_getParametersWithPlacementModel");
return data;
}
@end
@implementation ATTracker (Hook)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"HOOK APP ATTracker");
swizzleClassMethod([self class],
@selector(sendData:address:retryIfTimeout:),
@selector(hook_sendData:address:retryIfTimeout:));
});
}
+ (void) hook_sendData:(id) data address:(id) address retryIfTimeout:(bool) retryIfTimeout {
NSLog(@"hook_sendData url:%@",address);
[self hook_sendData:data address:address retryIfTimeout:retryIfTimeout];
post(data, @"ATTracker-hook-sendData");
}
@end
*/