iOS Hook 崩溃

作者 : admin 本文共1787个字,预计阅读时间需要5分钟 发布时间: 2024-06-10 共2人阅读

0x00 崩溃重现

Hook 的类,是这样的:

@interface ViewController : UIViewController
@end

@implementation ViewController
- (void)loadView {
    [super loadView];
    
    NSLog(@"%s", __func__);
}

- (void)test {
    NSLog(@"%s", __func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self test];
}

@end

写的 Hook 逻辑是这样的:

@interface Hook : NSObject
@end

#import 
@implementation Hook

+ (void)load {
    NSLog(@"%s", __func__);
    
    Class class = NSClassFromString(@"ViewController");
    Method originalMethod = class_getInstanceMethod(class, NSSelectorFromString(@"loadView"));
    Method swizzledMethod = class_getInstanceMethod([self class], NSSelectorFromString(@"swizzled_loadView"));
    
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

- (void)swizzled_loadView {
    NSLog(@"%s", __func__);

    [self swizzled_loadView];
}

@end

真机运行后,是这样的,直接崩溃:

+[Hook load]
-[Hook swizzled_loadView]
-[ViewController swizzled_loadView]: unrecognized selector sent to instance 0x102e08dd0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController swizzled_loadView]: unrecognized selector sent to instance 0x102e08dd0'

0x00 换个方式

写的 Hook 逻辑是这样的:

@interface UIViewController (Hook)
@end

#import 
@implementation UIViewController (Hook)

+ (void)load {
    NSLog(@"%s", __func__);
    
    Class class = NSClassFromString(@"ViewController");
    Method originalMethod = class_getInstanceMethod(class, NSSelectorFromString(@"loadView"));
    Method swizzledMethod = class_getInstanceMethod([self class], NSSelectorFromString(@"swizzled_loadView"));

    method_exchangeImplementations(originalMethod, swizzledMethod);
}

- (void)swizzled_loadView {
    NSLog(@"%s", __func__);

    [self swizzled_loadView];
    
    UIView *view = [[UIView alloc] init];
    view. frame = CGRectMake (100, 200, 200, 200);
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
}

@end

真机运行后,不崩溃了:

+[UIViewController(Hook) load]
-[UIViewController(Hook) swizzled_loadView]
-[ViewController loadView]
-[ViewController test]

并且成功,添加了 view


本站无任何商业行为
个人在线分享 » iOS Hook 崩溃
E-->