9

クラッキングから保護するために、アプリケーションが App Store から購入されたかどうかを確認する方法が以前はありました。

NSBundle *bundle = [NSBundle mainBundle]; 
NSDictionary *info = [bundle infoDictionary]; 
if ([info objectForKey: @"SignerIdentity"] != nil) 
{ /* do something */  }

しかし、クラッカーが Info.plist を変更する方法を発見したため、この方法は機能しなくなりました。私はこの古い質問を認識していますが、そこに示されている回答は上記の手法に依存しており、もはや有効ではありません。

Info.plist から SignerIdentity を読み取らずに、アプリケーションがクラックされたか、App Store から合法的に購入されたかをどのように検出できますか?

4

4 に答える 4

12

短くてシンプルなので、個人的にはミックの答えが好きです。

Greg の応答は無効です -- Mick のコードは、アプリがその URL を開くことができるかどうかのみをチェックするため、クラッシュする可能性はありません。

アプリが暗号化されているかどうかをより厳密にチェックする前に、自分のアプリの 1 つに以下を実装しました。暗号化されていない場合は、おそらくクラックされたアプリです。

分析によると、この方法で何千人もの海賊版ユーザーを防いでおり、実装に 5 分ほどかかったので、コストはほとんどかかりませんでした。とにかく行くつもりはありません-それは、人々が私のハードワークからたむろしていることを望んでいないということです)。さらに、私のアプリのコンテンツの多くは、アプリが海賊版であるかどうかを判断した後に情報をフィードし、海賊版である場合はジャンク データを返します。

main.m で

#import <dlfcn.h>
#import <mach-o/dyld.h>
#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR && !defined(LC_ENCRYPTION_INFO)
#define LC_ENCRYPTION_INFO 0x21
struct encryption_info_command {
    uint32_t cmd;
    uint32_t cmdsize;
    uint32_t cryptoff;
    uint32_t cryptsize;
    uint32_t cryptid;
};
#endif

static BOOL isEncrypted();

static BOOL isEncrypted () {
    const struct mach_header *header;
    Dl_info dlinfo;

    /* Fetch the dlinfo for main() */
    if (dladdr(main, &dlinfo) == 0 || dlinfo.dli_fbase == NULL) {
        //NSLog(@"Could not find main() symbol (very odd)");
        return NO;
    }
    header = dlinfo.dli_fbase;

    /* Compute the image size and search for a UUID */
    struct load_command *cmd = (struct load_command *) (header+1);

    for (uint32_t i = 0; cmd != NULL && i < header->ncmds; i++) {
        /* Encryption info segment */
        if (cmd->cmd == LC_ENCRYPTION_INFO) {
            struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) cmd;
            /* Check if binary encryption is enabled */
            if (crypt_cmd->cryptid < 1) {
                /* Disabled, probably pirated */
                return NO;
            }

            /* Probably not pirated <-- can't say for certain, maybe theres a way around it */
            return YES;
        }

        cmd = (struct load_command *) ((uint8_t *) cmd + cmd->cmdsize);
    }

    /* Encryption info not found */
    return NO;
}
于 2012-10-19T14:10:44.040 に答える
3

Appleの公式回答:

Hello Dmitry,

Thank you for contacting Apple Developer Technical Support (DTS). 

DTS does not provide code-level support for DRM issues.  

Please try posting your inquiry to Apple Development Forum:

<https://devforums.apple.com>

While you were initially charged a Technical Support Incident (TSI) for this request, we have assigned a replacement TSI back to your account.

Thank you for understanding our support policies.

Best Regards,

Apple Developer Support 
Worldwide Developer Relations
于 2012-10-27T20:32:20.203 に答える
1

@ user1353482が提案したのと同じこと(および同じ方法)を行う小さなコードスニペットを提案します。私はコメントを書きますが、コードは読めません。さらに、私は間違っているかもしれませんが、シミュレーター用にコンパイルする場合でも、追加の定義はもう必要ないようです (少なくともこれは xcode 4.5.1 で動作し、ターゲットは 5.0 です)。

このコードはデバッグおよびアドホック バイナリで false を返すことに注意してください。最終的な暗号化を行うのはAppleであり、自宅でこれを試してはいけません:)

#include <execinfo.h>
#import <mach-o/ldsyms.h>

bool executableEncryption()
{
    const uint8_t *command = (const uint8_t *) (&_mh_execute_header + 1);
    for (uint32_t idx = 0; idx < _mh_execute_header.ncmds; ++idx)
    {
        if (((const struct load_command *) command)->cmd == LC_ENCRYPTION_INFO)
        {
            struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) command;    
            if (crypt_cmd->cryptid < 1)
                return false;
            return true;
        }
        else
        {
            command += ((const struct load_command *) command)->cmdsize;
        }
    }
    return false;
}
于 2012-10-24T21:18:58.787 に答える
-4

アプリケーションが App Store から購入されたかどうかを確認するためのチェックではありませんが、次のコードを使用して、アプリケーションがジェイルブレイクされたデバイスで実行されているかどうかを確認します。

+(BOOL)isJailbroken { 
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"]; 
    return [[UIApplication sharedApplication] canOpenURL:url]; 
} 
于 2012-10-12T08:32:36.437 に答える