Leí un blog muy interesante sobre la implementación de protección antipiratería en sus aplicaciones. Algunos de ellos ya no funcionan, algunos lo hacen. Los 2 que todavía son efectivos hasta cierto punto son los 2 últimos en la lista. http://shmoopi.wordpress.com/2011/06/19/27/Verificación de cifrado ejecutable contra medida de piratería
El que estoy interesado es el último. Código a continuación. Lo he implementado en mi AppDelegate.m
Antipiratería a través de la verificación de encriptación.
encabezados obligatorios
#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
métodos necesarios
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;
}
Este método comprueba para ver si el binario todavía está cifrada.
Cuando ejecuto esto en el dispositivo conectado al Xcode me da un falso positivo en esta línea
if (crypt_cmd->cryptid < 1)
{
NSLog(@"Pirated from (crypt_cmd->cryptid < 1) ");
return NO;
}
Me preguntaba ¿Es posible que las compilaciones Xcode pone en el dispositivo para fines de depuración no se encriptado? Y solo está encriptado cuando la compilación se envía a Apple para su uso en iTunes. Por lo tanto, estoy obteniendo este falso positivo cuando reviso el código.
Muchas gracias, -Code
Incluso en mi dispositivo de prueba funciona de la misma manera. Me pregunto ¿es el hecho de que Apple aplica el cifrado cuando lo preparan para la tienda de aplicaciones? Entonces no se aplica cuando lo construimos nosotros mismos en nuestros dispositivos locales. –