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
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. –