我试图在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
转换为函数指针有问题。似乎有很多争议。
答案 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
功能。