2011-08-12 13 views
5

Przeczytałem bardzo interesujący blog o wdrażaniu ochrony antypirackiej w twoich aplikacjach. Niektóre z nich już nie działają, niektóre z nich to robią. Te 2, które wciąż są skuteczne w pewnym stopniu, są wymienione 2 ostatnie. http://shmoopi.wordpress.com/2011/06/19/27/Wykrywalny test anty-piractwa sprawdzający

Ten, który mnie interesuje, jest ostatnim. Kod poniżej. Zaimplementowałem to w moim AppDelegate.m

Anty piractwo za pomocą sprawdzania szyfrowania.

wymaganymi nagłówkami

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

Encryption struct

#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 

Potrzebni Metody

int main (int argc, char *argv[]); 

static BOOL is_encrypted() 
{ 
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) 
     { 
      return NO; 
     } 
     return YES; 
    } 

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

Metoda ta sprawdza, czy plik binarny nadal szyfrowane.

Kiedy uruchomić tego urządzenia dołączone do Xcode daje mi fałszywy alarm na tej linii

if (crypt_cmd->cryptid < 1) 
{ 
    NSLog(@"Pirated from (crypt_cmd->cryptid < 1) "); 
    return NO; 
} 

Zastanawiałem się, czy to możliwe, że buduje Xcode stawia na urządzenia do celów nie debugowania zaszyfrowane? I to jest tylko zaszyfrowane, gdy kompilacja zostanie przesłana do Apple do użytku w iTunes. Stąd dlaczego otrzymuję ten fałszywy pozytyw, kiedy sprawdzam kod.

Wiele Dzięki -code

Odpowiedz

0

Wygląda to szuka bloku podpis w nagłówku dyload. Oznacza to, że zobaczysz to tylko na kodzie, który jest podpisany. Prawdopodobnie twój kod nie jest automatycznie podpisywany w celu debugowania (niepotrzebne), chociaż zostanie podpisany, gdy przejdzie do urządzenia.

Możesz chcieć uzależnić tę weryfikację od projektu działającego na urządzeniu z systemem iOS, a nie w symulatorze. Każdy plik binarny wysłany na urządzenie iOS musi być podpisany.

#if !(TARGET_IPHONE_SIMULATOR) 
your check 
#endif // 
+0

Nawet na moim urządzeniu testowym działa tak samo. Zastanawiam się, czy jest to fakt, że szyfrowanie jest stosowane przez Apple, gdy przygotowują go do obsługi aplikacji. Dlatego nie stosuje się go, gdy sami go budujemy na naszych lokalnych urządzeniach. –

1

Sprawdzałem to również niedawno i testowałem z tymi samymi wynikami. Okazuje się, że ten kod mówi TAK lub NIE na podstawie tego, czy plik binarny jest zaszyfrowany za pomocą programu FairPlay DRM firmy Apple. Wszelkie budowane kompilacje debugowania lub ad-hoc powiedzą NIE.

Możesz zobaczyć te same informacje na swoich binariach lub dowolnych zakupionych aplikacjach iPhone za pomocą narzędzia wiersza poleceń otool.

Dla własnych plików binarnych znajdź plik binarny w projekcie pod build/Debug-iphoneos/MyApp.app i uruchom (z Terminalu)

otool -l MyApp | więcej

Przeszukaj stronę kryptydy w sekcji LC_ENCRYPTION_INFO. Ponieważ jest to kompilacja debugowania, będzie to 0. Jeśli zsynchronizowałeś swój telefon z komputerem, sprawdź w ~/Muzyka/iTunes/Aplikacje mobilne i wybierz plik .ipa. Rozpakuj go i wypróbuj przeciwnika z pliku binarnego z pliku .ipa i powinien on mieć wartość 1 dla kryptozy.

3

Lepszym komenda otool aby sprawdzić, czy plik jest szyfrowany lub nie jest:

otool -arch armv7 -l YourAppName | grep crypt 
4

Ten kod nie działa z powodzeniem na urządzeniu 64-bitowej jak iPhone 5s. Nagłówek został zmieniony z mach_header na mach_header_64, a identyfikator polecenia to teraz LC_ENCRYPTION_INFO_64.

To, co zrobiłem, to przeczytać nagłówek, a następnie zobaczyć, jaka była magiczna liczba. Jeśli to jest MH_MAGIC_64, to jesteś na 64-bitowym urządzeniu i musisz użyć struktury mach_header_64 i poszukać LC_ENCRYPTION_INFO_64 (zdefiniowanej jako 0x2C) zamiast LC_ENCRYPTION_INFO.

Powiązane problemy