2012-07-23 4 views
5

多くの人が知っているように、ハッカーがアプリ内購入を無料で手に入れることができるAppleの最近の状況があります。アップルは最近、this documentの方法を説明していますが、私はステップ#4でちょっと混乱しています。アプリ内購入のハッキングにパッチを当てる; 4番目のステップに固執する

最初の手順は、パッチ.hと.mをダウンロードしてプロジェクトに組み込み、セキュリティフレームワークにリンクすることです。さて、良い、それを得た。そして、Appleは言う:

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

エンコーダに関する部分は、私が何をすべき意味が正確に何を? (検証が成功したときに実行するアクションは私にはっきりしています)クラス内にはbase64_encodebase64_decodeの関数があります。しかし、それは何を求めるのですか?これはハッキングを防ぐために私が知っている特別なPIN番号のようなものですか?私はここで何をすべきか分からない。私はもちろん、エンコーディングとデコードの全体的なコンセプトは得ていますが、この状況で正しく生成する方法のプログラム特有のものはありません。 2エンコードと2つのデコード機能があることを、私も困惑してる

- (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; } 

:これはどんな場合に役立ちます

アップルなどのコードは、それを書き込みます。 NSString*を返すペアがありますが、なぜ2番目のペアはchar*void*を返しますか?これらの機能は何を返すと期待されていますか?私は本当にそれを取得していません。

+0

私はあなたが登録した開発者であれば、(あなたは年ごとに2つの取得コールをごアップルのサポートのいずれかを使用する - それらを使用しますか、それらを失う)。これは間違いをするか、間違っている可能性のあるアドバイスを使用するにはあまりにも重要です。 –

+0

@RoboticCatうーん、いい考えです。 Appleが彼らが私たちに与えたウェブページに何らかの説明を加えなかったのは私にとっては奇妙なことです。彼らは簡単なことを説明し(コードをダウンロードしてプロジェクトに追加する)、実際のコードを必要とする部分にぶら下げています。アドバイスをいただきありがとうございます。 – WendiKidd

+0

彼のウェブサイトをチェックしましたか? VerificationControllerの回避策を見つけたという。このクイックフィックスの実装に時間を費やす必要がありますか? –

答えて

0

彼らは汎用のベース64エンコーダが好きです。ここで読み、むしろ簡単だ二一つだ

http://cocoadev.com/wiki/BaseSixtyFour

(私はこれのいずれかをテストしていません免責事項:):ここでのコードのいくつかを試してみてください http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html

+0

そのページのコードは非常にひどくフォーマットされているので、読みにくいです。 (つまり、コードでなければならない行はコードのように書式化されず、コードではない行はコードのように書式設定されていますが、例題がどこから始まって終了するのか分かりません...)私は答えを見つけたとは思わない。私はまた、リンク上の例が1エンコードと1デコード機能を持っているのは混乱していますが、Appleは文字列を返す2つのうちの1つを要求し、次にchar *を返すエンコードとvoid *を返すデコードを望んでいます。なぜvoid *ですか?彼らは何を返そうとしていますか?/lost lost – WendiKidd

+0

また、リンクをさらに見てみようとしています...ほとんどの例では同じエンコーディングテーブルを使用していますが、巨大なデコードテーブルを使用するものもあれば、デコードテーブルをまったく占有しないものもあります。だから、私は疑問に思っています:エンコードテーブルが常に同じ場合、そのポイントは何ですか?ハックするのは簡単ではないでしょうか?その点に関して、Appleがコードを書いていないのはなぜですか?私はこの事件で非常に困惑しています... – WendiKidd

+0

それは奇妙ではありません。おそらく暗号機能の輸出規制と関係がありますか?とにかく、私は一見の価値がある答えに2番目のリンクを追加しました。はるかに良い配置。 –

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

関連する問題