Я пытаюсь вызвать частную функцию в структуре 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
к указателю функции. Похоже, что это вызывает немало споров.
Я думаю, что это было: мне удалось с помощью CTRegistrationGetCellularDataIsEnabled. Я очень удивлен тем, что 'CTRegistrationDataCounterGetLastResetTime' возвращает мусор. Я ошибался в этом вопросе. – Januzellij