调用私有函数的方法 function

最关键的是 dlopendlsym的用法

@implementation NSInputStream (Private)
// 解决错误:https://juejin.cn/post/7153606703399829511
- (NSURL *)url {
    // MX: /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
    NSString *path = [self decodeWithEncode:@"aaaaaaaaa"];
    void *handle = dlopen(path.UTF8String, RTLD_NOW);
    if (!handle) return nil;
    // 原始值:CFReadStreamGetInfoPointer
    NSString *symbol = [self decodeWithEncode:@"bbbbbbbb"];
    void *address = dlsym(handle, symbol.UTF8String);
    if (!address) return nil;
    // 函数原型:CF_EXPORT void *CFReadStreamGetInfoPointer(CFReadStreamRef stream);
    typedef void *(*function) (CFReadStreamRef stream);
    function func = (function) address;
    void *info = func((__bridge CFReadStreamRef) (self));
    if (!info) return nil;
    CFFileStreamContext *ctxt = (CFFileStreamContext *)info;
    if (!ctxt) return nil;
    CFURLRef cfURL = ctxt->url;
    if (!fURL) return nil;
    NSURL *nURL = (__bridge NSURL *) cFURL;
    if (![nsURL isKindOfClass:[NSURL class]]) return nil;
    return nsURL;
}

- (NSString *)decodeWithEncode: (NSString *)encode {
    NSData *data = [[NSData alloc] initWithBase64EncodedString:encode options:0];
    NSString *decoded = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return decoded;
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容