dlsym无法从CoreTelephony安静地加载

时间:2014-11-26 14:48:17

标签: ios objective-c c dll core-telephony

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

我知道CoreTelephony二进制文件和CTRegistrationDataCounterGetLastResetTime符号都存在,因为如果我插入gobbledegook,我会立即崩溃。代码编译良好,不会出现错误。

但是,我不认为函数被调用,因为它总是返回0,当它不应该时(CTRegistrationDataCounterGetLastResetTime函数返回上次重置蜂窝数据的日期,在1之后的秒数2001年1月,GMT,因此它返回double。NSDate得到了[NSDate dateWithTimeIntervalSinceReferenceDate:]

如果我不得不冒险猜测,我会说我将void *返回dlsym转换为函数指针有问题。似乎有很多争议。

1 个答案:

答案 0 :(得分:0)

我试图调用该方法,就像我通常那样,实际上它返回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);

我得到了我的运营商名称。所以我认为Apple刚刚删除了CTRegistrationDataCounterGetLastResetTime功能。 enter image description here