4

注 ---- 以下の回答では iOS6 の方法を使用しています。Apple はそれ以来、開発者による MAC アドレスへのアクセスを削除しています。iOS7+ 向けに開発している場合は、最初の回答を無視して、各デバイスに固有の他の変数 (アプリが最初に起動された日付など) に基づいて IAP ロック解除データを暗号化するだけです。

トーンのロックを解除する必要がある機能があるので、それらを plist ファイルに保存しています....チャット ルームの新しいアバターのような機能は、ID「13891」を持つことができ、ロックが解除されている場合は、「93」などのキーを割り当てることができます。 "そして、それがロックされている場合、たとえば、他のキー "37" を持っている可能性があります....したがって、plist は次のように表示されます: "13891" = "93" このデータを保存するより良い方法は何ですか? 毎回 Apple のサーバーをチェックする必要はありません。インターネット接続が低いと時間がかかりすぎます。

編集:現在の回答:

取るべき4つの対策:

1) キーチェーンに保管します。(または、メジャー#4を追加したので、plistに推測します)

2) 毎回 Apple のサーバーをチェックしますが、遅延が気になる場合は、バックグラウンドでチェックし、それまでの間、ユーザーが許可されている場合はアプリを使用させます。

3) 変数を暗号化されたキーとしてキーチェーンに保存します...「FishingRod = unlocked」を保存しないでください「3dhk34D@HT% = d3tD@#」を保存してください。

4) 各キーをデバイスの MAC アドレスで暗号化します (これらの MAC アドレスは変更されず、WiFi 接続の有無にかかわらず利用できます... 以下のコード)。そうすれば、ユーザーがインターネットから plist をダウンロードして使用しようとしても、デバイス ID を使用して復号化すると、ロック解除キーの代わりにナンセンスをランダムにすることはできないため、機能しません (私の例では、 "d3tD@#" になります。) !!! -- iOS7 以降では Mac アドレスにアクセスできなくなりました。代わりに、アプリが最初に起動された日付など、他のデバイス固有のもので暗号化します。

MACアドレスコード(.HインポートのView Controller ViewDidAppear ...に貼り付けるだけです)

#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>

-(void)viewDidAppear:(BOOL)animated {

    int                 mgmtInfoBase[6];
    char                *msgBuffer = NULL;
    NSString            *errorFlag = NULL;
    size_t              length;

    // Setup the management Information Base (mib)
    mgmtInfoBase[0] = CTL_NET;        // Request network subsystem
    mgmtInfoBase[1] = AF_ROUTE;       // Routing table info
    mgmtInfoBase[2] = 0;
    mgmtInfoBase[3] = AF_LINK;        // Request link layer information
    mgmtInfoBase[4] = NET_RT_IFLIST;  // Request all configured interfaces

    // With all configured interfaces requested, get handle index
    if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0)
        errorFlag = @"if_nametoindex failure";
    // Get the size of the data available (store in len)
    else if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0)
        errorFlag = @"sysctl mgmtInfoBase failure";
    // Alloc memory based on above call
    else if ((msgBuffer = malloc(length)) == NULL)
        errorFlag = @"buffer allocation failure";
    // Get system information, store in buffer
    else if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)
    {
        free(msgBuffer);
        errorFlag = @"sysctl msgBuffer failure";
    }
    else
    {
        // Map msgbuffer to interface message structure
        struct if_msghdr *interfaceMsgStruct = (struct if_msghdr *) msgBuffer;

        // Map to link-level socket structure
        struct sockaddr_dl *socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);

        // Copy link layer address data in socket structure to an array
        unsigned char macAddress[6];
        memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6);

        // Read from char array into a string object, into traditional Mac address format
        NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
                                      macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]];
        NSLog(@"Mac Address: %@", macAddressString);

        // Release the buffer memory
        free(msgBuffer);

        //return macAddressString;
        NSLog(@"MAC: %@", macAddressString);
        //F0:DC:E2:1D:EB:50
    }

    // Error...
    NSLog(@"Error: %@", errorFlag);
}

注: 私は友人から MAC アドレス コードを入手しました... 私がコードを書いたと主張しているわけではありません... 彼がそれを書いたのか、それとも他の誰かから入手したのかはわかりません。

4

3 に答える 3

4

取るべき4つの対策:

1)キーホルダーに保存します。(または、メジャー#4を追加したのでplistします)

2)Appleのサーバーを毎回チェックしますが、その後の遅延が心配な場合は、バックグラウンドでチェックし、それまでの間、可能であればユーザーにアプリを使用させてください。

3)変数を暗号化されたキーとしてキーチェーンに保存します...「FishingRod=unlocked」ストア「3dhk34D@HT%= d3tD @#」は保存しないでください。

4)各キーをデバイスのMACアドレスで暗号化します(これらのMACアドレスは変更されず、WiFi接続の有無にかかわらず使用できます...以下のコード)。そうすれば、ユーザーがインターネットからplistをダウンロードして使用しようとしても、デバイスIDを使用して復号化すると、ロック解除キーの代わりにナンセンスをランダム化できないため、機能しません(私の例では「d3tD@#」になります。)!!! --iOS7以降ではMacアドレスにアクセスできなくなり、代わりに、アプリが最初に起動された日付など、他のデバイス固有のもので暗号化されます

MACアドレスコード(.HインポートのView Controller ViewDidAppear ...に貼り付けるだけです)

#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>

-(void)viewDidAppear:(BOOL)animated {

    int                 mgmtInfoBase[6];
    char                *msgBuffer = NULL;
    NSString            *errorFlag = NULL;
    size_t              length;

    // Setup the management Information Base (mib)
    mgmtInfoBase[0] = CTL_NET;        // Request network subsystem
    mgmtInfoBase[1] = AF_ROUTE;       // Routing table info
    mgmtInfoBase[2] = 0;
    mgmtInfoBase[3] = AF_LINK;        // Request link layer information
    mgmtInfoBase[4] = NET_RT_IFLIST;  // Request all configured interfaces

    // With all configured interfaces requested, get handle index
    if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0)
        errorFlag = @"if_nametoindex failure";
    // Get the size of the data available (store in len)
    else if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0)
        errorFlag = @"sysctl mgmtInfoBase failure";
    // Alloc memory based on above call
    else if ((msgBuffer = malloc(length)) == NULL)
        errorFlag = @"buffer allocation failure";
    // Get system information, store in buffer
    else if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)
    {
        free(msgBuffer);
        errorFlag = @"sysctl msgBuffer failure";
    }
    else
    {
        // Map msgbuffer to interface message structure
        struct if_msghdr *interfaceMsgStruct = (struct if_msghdr *) msgBuffer;

        // Map to link-level socket structure
        struct sockaddr_dl *socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);

        // Copy link layer address data in socket structure to an array
        unsigned char macAddress[6];
        memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6);

        // Read from char array into a string object, into traditional Mac address format
        NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
                                      macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]];
        NSLog(@"Mac Address: %@", macAddressString);

        // Release the buffer memory
        free(msgBuffer);

        //return macAddressString;
        NSLog(@"MAC: %@", macAddressString);
        //F0:DC:E2:1D:EB:50
    }

    // Error...
    NSLog(@"Error: %@", errorFlag);
}
于 2012-12-30T19:22:36.523 に答える
3

脱獄する必要さえありません。書き込み可能なファイルをどこに保存しても、iPhone Explorer のようなアプリケーションを使用すると、ユーザーはそのファイルを取得して変更し、デバイスに書き戻すことができます。ロックされていない plist ファイルをインターネット全体に送信するには、1 人のユーザーが購入するだけで済みます。

私がすることは、ロック解除されたアイテムをデバイスのキーチェーンに保存し (もう少しわかりにくくするため)、起動時にそれを信頼することですが、毎回バックグラウンドで Apple サーバーに接続して、ユーザーは本当にそれらのロックされていないアイテムを持っている必要があります。そうすれば、キーチェーン エントリを偽造できたとしても、アイテムのロックを短時間解除することができますが、アプリの実行中にデバイスがインターネットに接続されていると、機能が削除されます。毎回実行する前にデバイスをインターネット接続から切断することを忘れないようにしなければならないことは、盗まれたロック解除を偽造者にとって価値のあるものにするには、おそらくあまりにも面倒です.

キーチェーンはアプリケーションの削除後も存続するため、最初に作成された plist ファイルが後の起動で検出されない場合は、最初の起動時に plist ファイルを書き出すこともできます。キーチェーンをクリアします。

とはいえ、誰かがあなたのアプリをいじったりロックを解除したりするリスクはおそらく低いでしょう。状況が不透明な場合は、実際のユーザーに問題を引き起こさないように、常にユーザー アクセスを許可する側で過ちを犯してください。

于 2012-12-29T21:14:07.407 に答える
1

ジェイルブレイクされた携帯電話は、plist ファイルを簡単に編集して、機能のロックを解除できますか?

はい、正確に。

このデータを保存するより良い方法は何ですか?

おそらくキーチェーンですが、ジェイルブレイクされたデバイスでも変更できます.

毎回 Apple のサーバーをチェックする必要はありません。インターネット接続が低いと時間がかかりすぎます。

残念な。少なくともある程度セキュリティを確保したい場合は、Apple のサーバーをチェックするか、自分のサーバーもチェックすることをお勧めします。(アプリの動作は MobileSubstrate を使用して必要に応じて変更できるため、ジェイルブレイクされた電話でゲームがハッキングされないという 100% の保証もありませんが、少なくとももう少し安全です.)

于 2012-12-29T21:01:18.770 に答える