修补程序内购买黑客; 卡在第四步
正如我们许多人所知道的那样,苹果最近出现了一种情况,黑客可以免费获得任何应用内购买。 苹果最近发布了这个文档描述如何修补它,但我有点困惑在第四步,并会感谢任何帮助。
第一步是下载他们的补丁.h和.m,将其包含在您的项目中,并将其与安全框架链接。 好的,好的,明白了。 然后苹果说:
4. Provide a base64 encoder, a base64 decoder, and the action to perform when validation succeeds.
关于编码器的部分到底意味着我应该做什么? (validation成功时执行的操作对我来说很清楚。)当然,我会在类中看到名为base64_encode
和base64_decode
的函数。 但是这是什么要求呢? 这就像我知道的一个特殊的PIN码,以防止黑客? 我不确定在这里做什么。 当然,我得到编码和解码的整体概念,但不是如何在这种情况下正确生成编码和解码的编程细节。
苹果公司的代码写道,如果这有助于任何:
- (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; }
我也困惑,有2编码和2解码function。 我得到有一对返回NSString*
s,但为什么第二对返回一个char*
和一个void*
? 这些function预期会返回什么? 我真的不明白。
听起来他们想要一个通用的base64编码器。 试试这里的一些代码:
http://cocoadev.com/wiki/BaseSixtyFour
(免责声明:我没有testing过这个)
这是另一个更容易阅读: http : //cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html
请看一下提供的解决scheme: 这里 ,由未知作者发布。
其中包含下面的代码,我testing和为我工作:
// 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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 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; }