我试图在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/

10-11 00:43