Ios app使用method swizzling怎么hook系统权限弹出的UIAlertController?

需求:
需求是想通过交换方法的方法hook住类似于获取地理位置和访问照片一类的弹框UIAlertController的,随机选一个点击。

操作步骤:
自己试过在app里面通过category+交换方法,hook住自己弹出的UIAlertController的ViewDidApear方法,延时随机点击是可以的。
但是系统的获取地理位置和访问照片一类的弹框还是hook不住,想请教下是app的权限问题导致hook不到系统弹出来的UIAlertController,还是说系统的UIAlertView压根不是UIAlertController?

Code:


#import "CocoaHook.h"

@interface UIAlertController()
{
     NSMutableArray * _actions;
}

- (void)_dismissAnimated:(BOOL)arg1 triggeringAction:(UIAlertAction* )action;

@end

@implementation UIAlertController (Hook)

+ (void)hook
{
    OBJC_EXCHANGE_METHOD_OC([self class], @selector(viewDidAppear), @selector(hooViewDidAppear));
}

- (void)hooViewDidAppear
{
    NSLog(@"--------ALERT controller HOOK");

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            
            NSLog(@"%@",self.actions);
            
            NSInteger buttonIndex = arc4random_uniform([self.actions count]);
            
            NSLog(@"dismiss");
            [self _dismissAnimated:YES triggeringAction:[self.actions objectAtIndex:buttonIndex]];
        });
    });
}

@end

method swizzling:

bool OBJC_EXCHANGE_METHOD_OC(Class orgClass,
                                    SEL orgMethod,
                                    SEL newMethod)
{
    Method newMethodIns = class_getInstanceMethod(orgClass, newMethod);
    Method orgMethodIns = class_getInstanceMethod(orgClass, orgMethod);

    if(!orgMethodIns || !newMethodIns)
    {
        return false;
    }
    
//    method_exchangeImplementations(orgMethodIns, newMethodIns);
    
    const char* typeEncoding = method_getTypeEncoding(newMethodIns);
    IMP oldIMP = class_replaceMethod(orgClass, orgMethod, method_getImplementation(newMethodIns), typeEncoding);
    assert(oldIMP);
    class_replaceMethod(orgClass, newMethod, oldIMP, typeEncoding);
    
    
    return true;
}

没记错的话应该是单独的Daemon进程/XPC服务负责的。

恩,也怀疑是根本获取不到这个对象,网上搜了一大轮,或许只能换个思路,从弹出者入手

系统的弹窗并不在app的进程里,应该是在SpringBoard里的吧

震惊! ?国app开发者五分钟绕过苹果公司的安全体系窃取用户隐私!

不过需求是不能通过越狱去做,有可能可以获取得到SpringBoard的最前一个viewcontroller吗?
应该是跟app没关的,app退掉之后,弹框还在

大神求不虐。。估计也是个难搞的主才来这里问问

祝你早日成功

/s

:joy::joy:

我只试过用越狱机hook到这个弹窗并自动选择允许或者不允许~~

恩,越狱估计可以,确实大神说的对,估计这个方向悬了,得换个角度处理

hook应该是没指望的。其他野路子逆向下底层实现看看。

不过我真不认为AAPL这么傻

我个人的话会试试看看其中有没有什么系统进程间的IPC机制然后从IPC下手看看有没有什么缺陷可以利用。不过还是那句话,我真不认为AAPL这么傻

对,估计是只能是通过这种缺陷去控制,我也觉得苹果不是傻的。。
实在不行只能放弃这个方向了

越狱的怎么弄的?

low一点就是模拟用户点击呗