2012-07-23 46 views
5

正如我們許多人所知,蘋果公司最近出現了一種情況,黑客可以免費獲得任何應用內購買。蘋果最近發佈了this document描述如何修補它,但我有點困惑第4步,並會感謝任何幫助。修補程序內購買黑客;堅持第四步

第一步是下載他們的補丁.h和.m,將其包含在您的項目中,並將其與安全框架鏈接。好的,很好,明白了。然後,蘋果說:

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

究竟做對編碼器的意思是我應該做的一部分嗎? (驗證成功時執行的操作對我來說很清楚。)當然,我在課堂上看到名爲base64_encodebase64_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種功能。我得到有一對返回NSString* s,但爲什麼第二對返回char*void*?這些功能預期會返回什麼?我真的不明白。

+0

我會用來電,如果你是一個註冊的開發者(你每年兩次的Apple技術支持之一 - 使用它們或失去他們)。這太重要了,不能在錯誤或使用可能不正確的建議時使用。 – 2012-07-23 14:15:44

+0

@RoboticCat嗯,這是一個好主意。對我來說,似乎很奇怪,蘋果沒有給他們給我們的網頁添加一些解釋。他們一步一步解釋簡單的事情(下載代碼,將其添加到您的項目中),然後讓我們掛在需要實際代碼的部分。感謝您的建議。 – WendiKidd 2012-07-23 15:37:34

+0

你檢查了他的網站嗎?它說他已經找到了VerificationController的解決方法。我們是否應該花時間來實施這個快速修復? – 2012-07-24 19:01:51

回答

0

聽起來就像他們想要一個通用的base64編碼器。嘗試一些代碼在這裏:

http://cocoadev.com/wiki/BaseSixtyFour

(免責聲明:我沒有測試過任何這)

這裏是第二個這是相當容易閱讀: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html

+0

該頁面上的代碼格式非常糟糕,所以我無法閱讀。 (也就是說,應該是代碼的行不像代碼那樣格式化,不是代碼的行被格式化爲代碼,很難看到示例開始和結束的位置......)我非常感謝你試圖將我指向右側方向,但我認爲我找不到答案。我也很困惑,該鏈接上的例子有1個編碼和1個解碼函數,但Apple希望每個返回2個字符串,然後返回char *的編碼和返回void *的解碼。爲什麼void *?他們想要返回什麼?/so丟失 – WendiKidd 2012-07-23 15:34:37

+0

嗯,還試圖通過鏈接進一步查看......似乎大多數示例使用相同的編碼表,儘管有些使用巨大的解碼錶,而其他的似乎根本沒有填充解碼錶。所以我想知道:如果編碼表總是相同的,它有什麼意義呢?難道不容易破解?對於這個問題,如果它總是相同的,Apple爲什麼不編寫代碼?我對這件事感到非常困惑...... – WendiKidd 2012-07-23 15:39:16

+0

奇怪的不是它。也許這是關於加密函數的出​​口限制?無論如何,我已經添加了第二個鏈接來回答這個值得一看。更好的安排。 – 2012-07-23 16:35:07

0

請有看看提交的解決方案:here,由未知作者發佈。

其中包含下面的代碼,這是我測試和我的作品:

// 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

該鏈接是直接從這個SO問題(http://stackoverflow.com/questions/11633577/iphone-finalizing-apples-vague-verificationcontroller-m?lq=1)裏面的內容,這實際上是這一個的副本。儘管如此,我還沒有機會查看代碼。我會這樣做,並回到你身邊;謝謝 :) – WendiKidd 2012-07-27 14:29:58