【问题标题】:What entitlements/permissions does the device pin controller class require?设备引脚控制器类需要哪些权利/权限?
【发布时间】:2013-03-07 10:19:38
【问题描述】:

我的 iphone 应用已越狱,我不在乎我的应用是否被应用商店拒绝。

我希望在我的程序中使用私有 API DevicePINController

我最近发现了名为DevicePINController 的私有API,但是它不能正常工作。该应用程序运行,除了它的方法之外,所有其他方法都不执行任何操作。它的BOOL 方法总是返回false。设置方法不做任何事情。

有人知道设备引脚控制器需要哪些权利权限吗?

编辑:代码

    id away = [[objc_getClass("DevicePINController") alloc]init];

    NSLog( [away simplePIN] ? @"YES":@"NO" );
    NSLog( [away _isBlocked] ? @"YES":@"NO" );
    NSLog( [away _attemptValidationWithPIN:@"1234"] ? @"YES":@"NO" );

    NSLog(@"%d",[away _unblockTime] );
    NSLog(@"%@",[away blockedStateKey] );
    NSLog(@"%@",[away blockTimeIntervalKey] );
    NSLog(@"%@",[away failedAttemptsKey] );
    NSLog(@"%d",[away pinLength] );
    NSLog(@"%@",[away stringsBundle] );

    NSLog(@"%@",[away stringsTable]);

每个方法调用都返回错误的答案。有些只返回null。 Bool 总是返回 NO。

【问题讨论】:

  • 您需要向我们展示您正在运行的代码,以便我们能够帮助您调试它为什么不起作用。谢谢。
  • 你测试过away是否等于nil吗?请记住,在 Objective-C 中,向 nil 对象发送 message 将什么都不做。如果该方法应该返回BOOL,则BOOL 的默认值为NO,因此如果away 为nil,您将返回一堆NO。
  • 看来你是对的。现在是 nil。但这不是使用私有 api 的正确方法吗?
  • 你是怎么打开Preferences.framework的?它是否包含在您的项目设置(构建阶段)中?或者,它是动态打开的,使用dlopen()?如果您不确定这两个选项的含义,请告诉我。
  • 我不明白你的意思。我应该使用带有库的链接二进制文件来查找和链接preferences.framework吗?它目前没有添加到我的项目中。我认为我们在使用 objc_getClass 时不需要添加任何框架

标签: iphone ios objective-c jailbreak


【解决方案1】:

所以,第一个问题是你有一个nil 对象。在 Objective-C 中,向nil 对象发送消息将什么都不做。如果该方法应该返回一个BOOL,那么BOOL 的默认值是NO,所以如果away 为nil,你会得到一堆NO。

要回答你的后续问题(在你测试你确实有一个 nil 值之后)......你确实需要确保你的应用程序打开了 @987654327 所在的库@ 被定义为。否则,它将不知道该类是什么,也无法实例化它。所以,objc_getClass 将返回 nil 对象。

对于该类,它在 Preferences.framework 中定义,位于

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/PrivateFrameworks/Preferences.framework

(显然,根据您的安装目录和/或 SDK 版本进行调整)

您可以将其添加到 Xcode 中的项目中,方法是转到目标设置 -> Build Phases -> Link Binary With Libraries 并添加它。您当然必须导航到上面的目录,因为它是一个私有框架,并且不会显示在初始弹出列表中。

或者,您可以使用代码来动态加载库:

#import <objc/runtime.h>
#include <dlfcn.h>

void* libHandle = dlopen("/System/Library/PrivateFrameworks/Preferences.framework/Preferences", RTLD_LAZY);

id away = [[objc_getClass("DevicePINController") alloc] init];
if (away == nil) {
    NSLog(@"object is nil");
} else {
    if ([away respondsToSelector: @selector(simplePIN)]) {
        NSLog(@"object responds to selector!");
    }
}

close(libHandle);

我在 iOS 6.1(越狱)上对此进行了测试,它可以工作。

顺便说一下,请将您的 PIN 更改为 1234 以外的其他值。我的行李箱上有相同的组合;)

【讨论】:

  • 什么是 RTLD_LAZY ?它给出了一个错误。“使用未声明的标识符 RTLD_LAZY”
  • 抱歉,您还需要一个 #include &lt;dlfcn.h&gt; 来实现该常数。请参阅上面的更新代码。
  • 是的,_attemptValidationWithPIN 也不适合我。在这一点上,有一百万件事可能会出错。也许需要权利?也许参数不应该是NSString?也许字符串被散列或加盐,以防止逆向工程?也许需要先打另一个电话来设置控制器?这就是 iOS 黑客变得困难且耗时的地方。您是否在其他地方找到了有关该课程的任何信息?
  • 是的,还有很多其他的东西可能是必要的。可能需要对 SpringBoard 进行软重启才能使更改生效。您可能必须先设置旧密码 (setOldPassword:),然后才能更改 PIN。一旦您致电setPIN,您可能需要发布通知以更新设置。可能性几乎是无限的:(
  • @iOsBoy,顺便说一句,我很确定这需要您的应用程序拥有com.apple.managedconfiguration.profiled-access 权利,但我试过了,但它仍然不适合我。所以,我认为 more 仍然缺失。
猜你喜欢
  • 2019-11-13
  • 2014-08-28
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2019-06-24
  • 2020-04-06
相关资源
最近更新 更多