我试图在CoreTelephony框架中调用一个私有函数;下面是我的当前代码:
double (*func)(void);
void *handle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
if (!handle) {
[@{@"handle": @"handle"} writeToFile:@"/var/mobile/err.plist" atomically:YES];
}
*(void **)(&func) = dlsym(handle, "CTRegistrationDataCounterGetLastResetTime");
if (dlerror() != NULL) {
[@{@"symbol": @"symbol"} writeToFile:@"/var/mobile/err.plist" atomically:YES];
}
double r = (*func)();
NSNumber *a = [NSNumber numberWithDouble:r];
[@{@"time": a} writeToFile:@"/var/mobile/err.plist" atomically:YES];
dlclose(handle);
我知道CordeBuffy二进制和
CTRegistrationDataCounterGetLastResetTime
符号都存在,因为如果我插入GOBLUDEGOOK,要么我立即崩溃。代码编译得很好,没有出现错误。但是,我不认为函数被调用是因为它总是返回0,而不应该返回0(函数返回2001年1月1日格林尼治标准时间后的秒数内蜂窝数据上次重置的日期,因此它返回一个
CTRegistrationDataCounterGetLastResetTime
。使用double
获取NSDate)如果我不得不冒险猜测,我会说我将
[NSDate dateWithTimeIntervalSinceReferenceDate:]
返回的void *
强制转换为函数指针有问题。在这件事上似乎有着惊人的争议。 最佳答案
我试过像平常一样调用那个方法,实际上它返回0,所以我试着从CoreTelephony调用另一个方法。
void *handle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_NOW);
if (!handle) {
NSLog(@"Can't dlopen");
}
CFStringRef (*func)(CFAllocatorRef) = dlsym(handle, "CTRegistrationCopyLocalizedOperatorName");
if (dlerror() != NULL) {
NSLog(@"Can't find symbol");
}
CFStringRef r = func(CFAllocatorGetDefault());
dlclose(handle);
我知道接线员的名字。所以我认为苹果刚刚删除了
CTRegistrationDataCounterGetLastResetTime
功能。关于ios - dlsym无法从CoreTelephony静默加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27152062/