1

私の iPhone アプリはジェイルブレイクされており、アプリがアプリ ストアに拒否されても気にしません。

プログラムでプライベート API を使用したいと考えてDevicePINControllerいます。

最近、 というプライベート API を見つけましたが、DevicePINController正しく動作しません。アプリが実行され、そのメソッド以外は何もしません。そのBOOLメソッドは常に false を返します。set メソッドは何もしません。

デバイスピンコントローラーに必要な資格のアクセス許可を知っている人はいますか?

編集:コード

    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 を返します。

4

1 に答える 1

1

So, the first problem is that you have a nil object. In Objective-C, sending a message to a nil object will just do nothing. If the method is supposed to return a BOOL, the default value of BOOL is NO, so you'll get back a bunch of NOs if away is nil.

To answer your follow-up question (after you tested that you did actually have a nil value) ... you do need to make sure your app opens the library where the DevicePINController is defined. Otherwise, it won't know what that class is, and won't be able to instantiate it. So, objc_getClass will return you the nil object.

そのクラスについては、次の場所にあるPreferences.frameworkで定義されています。

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

(もちろん、インストール ディレクトリや SDK のバージョンに合わせて調整してください)

ターゲット設定 ->ビルド フェーズ->バイナリをライブラリにリンクして追加することで、Xcode のプロジェクトに追加することができます。これはプライベート フレームワークであり、最初のポップアップ リストには表示されないため、もちろん上記のディレクトリに移動する必要があります。

または、コードを使用してライブラリを動的にロードできます。

#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 (jailbroken) でテストしたところ、動作しました。

ところで、暗証番号を 以外に変更してください1234。私は荷物に同じ組み合わせを持っています;)

于 2013-03-08T07:47:34.280 に答える