2014-11-26 3 views
1

Я пытаюсь вызвать частную функцию в структуре CoreTelephony; вот мой текущий код:dlsym не работает по тихому загрузке с 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 года, GMT, поэтому он возвращает double. NSDate это получил с [NSDate dateWithTimeIntervalSinceReferenceDate:])

Если бы я должен был догадка, я бы сказал, что что-то не так с моей отливкой void * возвращенного dlsym к указателю функции. Похоже, что это вызывает немало споров.

ответ

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

+0

Я думаю, что это было: мне удалось с помощью CTRegistrationGetCellularDataIsEnabled. Я очень удивлен тем, что 'CTRegistrationDataCounterGetLastResetTime' возвращает мусор. Я ошибался в этом вопросе. – Januzellij

 Смежные вопросы

  • Нет связанных вопросов^_^