Jak mogę wykryć, że aplikacja została złamana bez sprawdzania SignerIdentity?

Kiedyś istniała metoda sprawdzania, czy aplikacja została zakupiona w App Store, w celu ochrony przed pękaniem:

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

Ale ta metoda już nie działa, ponieważ krakersi znaleźli sposoby na zmianę Informacji.plist. Zdaję sobie sprawę z tego starszego pytania, ale przedstawione tam odpowiedzi opierają się na powyższej technice, która już nie jest aktualna.

Jak można wykryć, czy aplikacja została złamana lub zakupiona legalnie z aplikacji Przechowuj bez odczytywania SignerIdentity z Info.plist?

Author: Community, 2012-10-08

4 answers

Chociaż nie sprawdzam, czy aplikacja została zakupiona w App Store, używam tego kodu, aby sprawdzić, czy moja aplikacja działa na urządzeniu jailbroken:

+(BOOL)isJailbroken { 
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"]; 
    return [[UIApplication sharedApplication] canOpenURL:url]; 
} 
 -4
Author: Mick Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-12 08:32:36

Osobiście podoba mi się odpowiedź Micka, ponieważ jest krótka i prosta.

ODPOWIEDŹ Grega nie jest prawidłowa -- kod Micka sprawdza tylko, czy aplikacja może otworzyć ten adres URL, więc nie powinno być szans na awarię.

Zaimplementowałem następujące w jednej z moich aplikacji wcześniej, który robi bardziej rygorystyczne sprawdzenie, czy aplikacja jest zaszyfrowana, czy nie, jeśli nie jest to najprawdopodobniej pęknięta aplikacja:

Z analytics, ta metoda zapobiegła dla mnie tysiącom pirackich użytkowników i zajęła może 5 minut do wdrożenia, więc koszt zrobienia tego był prawie niczym - dla mnie nie obchodziło mnie, czy zwiększy sprzedaż (co i tak byłem pewien, że nie będzie-to bardziej, że nie chcę, aby ludzie freeloading off mojej ciężkiej pracy). Ponadto duża ilość treści mojej aplikacji karmi informacje po ustaleniu, czy aplikacja jest piracka, czy nie, i zwraca niepotrzebne dane, jeśli tak jest.

In 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;
}
 12
Author: webstersx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 14:18:05

Oficjalna odpowiedź 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
 3
Author: Dmitry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-27 20:32:20

Sugerowałbym mniejszy fragment kodu, który robi to samo, co sugerował @user1353482 (i w ten sam sposób). Pisałbym w komentarzach, ale kod byłby wtedy nieczytelny. Co więcej, mogę się mylić, ale wydaje się, że dodatkowe definicje nie są już potrzebne nawet przy kompilacji dla Simulatora (przynajmniej działa to w xcode 4.5.1, cel to 5.0).

Proszę zauważyć, że ten kod zwraca false przy debugowaniu i adhoc binary, ale mówimy o appstore, prawda? To Apple robi finał szyfrowanie i nie powinno się tego próbować w domu:)

#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;
}
 1
Author: Tertium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-24 21:18:58