2012-07-23 17 views
5

Como muchos de nosotros sabemos, ha habido una situación reciente con Apple donde los hackers pueden obtener cualquier compra en la aplicación de forma gratuita. Apple lanzó recientemente this document describiendo cómo aplicar parches, pero estoy un poco confundido en el paso 4 y agradecería cualquier ayuda.Patching In-App Purchase hack; atascado en el cuarto paso

Los primeros pasos son descargar su parche .h y .m, incluirlo en su proyecto y vincularlo con el marco de seguridad. De acuerdo, bien, lo tengo. A continuación, Apple dice:

4. Provide a base64 encoder, a base64 decoder, and the action to perform when validation succeeds.

¿Qué significa exactamente la parte de los codificadores significa que deba hacer? (La acción a realizar cuando la validación tiene éxito es clara para mí.) Veo las funciones llamadas base64_encode y base64_decode en la clase, sin duda. Pero, ¿qué está pidiendo? ¿Es esto como un número de PIN especial que solo yo conozco para evitar el pirateo? No estoy seguro de qué hacer aquí. Obtengo los conceptos generales de codificación y decodificación, por supuesto, pero no las características programáticas de cómo generar uno correctamente en esta situación.

El código de Apple como lo escribe, si esto ayuda a cualquiera:

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length 
{ 
#warning Replace this method. 
    return nil; 
} 

- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length 
{ 
#warning Replace this method. 
    return nil; 
} 

#warning Implement this function. 
char* base64_encode(const void* buf, size_t size) 
{ return NULL; } 

#warning Implement this function. 
void * base64_decode(const char* s, size_t * data_len) 
{ return NULL; } 

También estoy perplejo de que hay 2 codificar y decodificar 2 funciones. Entiendo que hay un par que devuelve NSString* s, pero ¿por qué el segundo par devuelve un char* y un void*? ¿Qué se espera que devuelvan estas funciones? Realmente no lo entiendo.

+0

me gustaría utilizar uno de su soporte de Apple llamadas, si usted es un desarrollador registrado (te dan dos por año - usarlas o perderlas). Esto es demasiado importante para cometer un error o utilizar un consejo que puede ser incorrecto. –

+0

@RoboticCat Hmm, esa es una buena idea. Me parece extraño que Apple no haya agregado alguna explicación a la página web que nos dieron. Explican las cosas fáciles (descarga el código, agrégalo a tu proyecto) paso a paso, y luego déjanos colgando en la parte que requiere código real. Gracias por el consejo. – WendiKidd

+0

¿Has revisado su sitio web? Dice que ha encontrado una solución alternativa para VerificationController. ¿Deberíamos incluso tomarnos el tiempo de implementar esta solución rápida? –

Respuesta

0

Parece que quieren un codificador base64 de propósito general. Pruebe algunos de los códigos aquí:

http://cocoadev.com/wiki/BaseSixtyFour

(disclaimer: no he probado nada de esto)

Aquí hay una segunda que es bastante más fácil de leer: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html

+0

El código en esa página está formateado muy mal, por lo que tengo problemas para leerlo. (es decir, las líneas que deberían ser código no están formateadas como código, las líneas que no son código tienen el formato de código, es difícil ver dónde comienzan y terminan los ejemplos ...) Realmente aprecio que trates de señalarme hacia la derecha dirección, pero no creo haber encontrado la respuesta.También estoy confundido porque los ejemplos en ese enlace tienen 1 función de codificación y 1 de decodificación, pero Apple quiere 2-uno de cada uno que devuelve una cadena, luego una codificación que devuelve char * y decodificación que devuelve void *. ¿Por qué void *? ¿Qué es lo que quieren devolver?/tan perdido – WendiKidd

+0

Hmm, también, tratando de mirar más a través del enlace ... Parece que la mayoría de los ejemplos usan la misma tabla de codificación, aunque algunos usan enormes tablas de decodificación y otros no parecen llenar la tabla de decodificación en absoluto. Así que me pregunto: si la tabla de codificación es siempre la misma, ¿de qué sirve? ¿No sería fácil piratear? Para el caso, si siempre es lo mismo, ¿por qué Apple no escribió el código? Estoy muy perplejo con todo este asunto ... – WendiKidd

+0

Es extraño, ¿verdad? Tal vez tiene que ver con las restricciones de exportación en funciones criptográficas? De todos modos, he agregado un segundo enlace a la respuesta que vale la pena ver. Mucho mejor arreglado –

0

Por favor, tener una mira una solución presentada: here, publicado por un autor desconocido.

que contiene el código siguiente, que he probado y funciona para mí:

// single base64 character conversion 
static int POS(char c) 
{ 
    if (c>='A' && c<='Z') return c - 'A'; 
    if (c>='a' && c<='z') return c - 'a' + 26; 
    if (c>='0' && c<='9') return c - '0' + 52; 
    if (c == '+') return 62; 
    if (c == '/') return 63; 
    if (c == '=') return -1; 

    [NSException raise:@"invalid BASE64 encoding" format:@"Invalid BASE64 encoding"]; 
    return 0; 
} 

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length 
{ 
    return [NSString stringWithUTF8String:base64_encode(input, (size_t)length)]; 
} 

- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length 
{ 
    size_t retLen; 
    uint8_t *retStr = base64_decode([input UTF8String], &retLen); 
    if (length) 
     *length = (NSInteger)retLen; 
    NSString *st = [[[NSString alloc] initWithBytes:retStr 
              length:retLen 
              encoding:NSUTF8StringEncoding] autorelease]; 
    free(retStr); // If base64_decode returns dynamically allocated memory 
    return st; 
} 

char* base64_encode(const void* buf, size_t size) 
{ 
    static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    char* str = (char*) malloc((size+3)*4/3 + 1); 

    char* p = str; 
    unsigned char* q = (unsigned char*) buf; 
    size_t i = 0; 

    while(i < size) { 
     int c = q[i++]; 
     c *= 256; 
     if (i < size) c += q[i]; 
     i++; 

     c *= 256; 
     if (i < size) c += q[i]; 
     i++; 

     *p++ = base64[(c & 0x00fc0000) >> 18]; 
     *p++ = base64[(c & 0x0003f000) >> 12]; 

     if (i > size + 1) 
      *p++ = '='; 
     else 
      *p++ = base64[(c & 0x00000fc0) >> 6]; 

     if (i > size) 
      *p++ = '='; 
     else 
      *p++ = base64[c & 0x0000003f]; 
    } 

    *p = 0; 

    return str; 
} 

void* base64_decode(const char* s, size_t* data_len_ptr) 
{ 
    size_t len = strlen(s); 

    if (len % 4) 
     [NSException raise:@"Invalid input in base64_decode" format:@"%d is an invalid length for an input string for BASE64 decoding", len]; 

    unsigned char* data = (unsigned char*) malloc(len/4*3); 

    int n[4]; 
    unsigned char* q = (unsigned char*) data; 

    for(const char*p=s; *p;) 
    { 
     n[0] = POS(*p++); 
     n[1] = POS(*p++); 
     n[2] = POS(*p++); 
     n[3] = POS(*p++); 

     if (n[0]==-1 || n[1]==-1) 
      [NSException raise:@"Invalid input in base64_decode" format:@"Invalid BASE64 encoding"]; 

     if (n[2]==-1 && n[3]!=-1) 
      [NSException raise:@"Invalid input in base64_decode" format:@"Invalid BASE64 encoding"]; 

     q[0] = (n[0] << 2) + (n[1] >> 4); 
     if (n[2] != -1) q[1] = ((n[1] & 15) << 4) + (n[2] >> 2); 
     if (n[3] != -1) q[2] = ((n[2] & 3) << 6) + n[3]; 
     q += 3; 
    } 

    // make sure that data_len_ptr is not null 
    if (!data_len_ptr) 
     [NSException raise:@"Invalid input in base64_decode" format:@"Invalid destination for output string length"]; 

    *data_len_ptr = q-data - (n[2]==-1) - (n[3]==-1); 

    return data; 
} 
+0

Ese enlace está extrayendo directamente el contenido de esta pregunta SO (http://stackoverflow.com/questions/11633577/iphone-finalizing-apples-vagui-verificationcontroller-m?lq=1) que en realidad es un duplicado de este. Sin embargo, todavía no había tenido la oportunidad de revisar el código. Lo haré y te llamaré; Gracias :) – WendiKidd