最关键的是 dlopen
和dlsym
的用法
@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