2012-07-23 31 views
5

हम में से कई जानते हैं कि ऐप्पल के साथ हाल ही की स्थिति रही है जहां हैकर्स मुफ्त में किसी भी इन-ऐप खरीद प्राप्त करने में सक्षम हैं। ऐप्पल ने हाल ही में this document जारी किया है कि इसे कैसे पैच करना है, लेकिन मैं चरण # 4 पर थोड़ा उलझन में हूं और किसी भी मदद की सराहना करता हूं।पैचिंग इन-ऐप खरीद हैक; चौथे चरण पर अटक गया

पहला कदम अपने पैच को डाउनलोड करना है। एच और एमएम, इसे अपनी परियोजना में शामिल करें, और सुरक्षा ढांचे के खिलाफ इसे लिंक करें। ठीक है, अच्छा, समझ गया। फिर एप्पल का कहना है:

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

वास्तव में क्या एनकोडर मुझे क्या करना चाहिए मतलब के बारे में हिस्सा करता है? (प्रमाणीकरण सफल होने पर प्रदर्शन करने की क्रिया मुझे स्पष्ट करती है।) मुझे कक्षा में base64_encode और base64_decode नामक फ़ंक्शंस दिखाई देता है। लेकिन यह क्या पूछ रहा है? क्या यह एक विशेष पिन नंबर की तरह है जो केवल मुझे पता है, हैकिंग को रोकने के लिए? मुझे यकीन नहीं है कि यहां क्या करना है। मुझे निश्चित रूप से एन्कोडिंग और डिकोडिंग की समग्र अवधारणाएं मिलती हैं, लेकिन इस स्थिति में एक को सही तरीके से उत्पन्न करने के प्रोग्रामेटिक विनिर्देशों को नहीं।

एप्पल के रूप में कोड यह लिखते हैं, अगर यह किसी भी मदद करता है:

- (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* एस लौटाती है, लेकिन दूसरी जोड़ी char* और void* क्यों लौटाती है? इन कार्यों को वापस करने की क्या उम्मीद है? मुझे वास्तव में यह नहीं मिला।

+0

मैं अपने Apple समर्थन से एक कॉल, यदि आप एक पंजीकृत डेवलपर हैं (आप दो प्रति वर्ष मिल का प्रयोग करेंगे - उन्हें का उपयोग करें या उन्हें खोना)। गलती करने या सलाह का उपयोग करने के लिए यह बहुत महत्वपूर्ण है जो गलत हो सकता है। –

+0

@RoboticCat हम्म, यह एक अच्छा विचार है। यह मेरे लिए अजीब लगता है कि ऐप्पल ने हमें दिए गए वेबपृष्ठ में कुछ स्पष्टीकरण नहीं जोड़ा है। वे आसान चीजों को समझते हैं (कोड डाउनलोड करें, इसे अपनी परियोजना में जोड़ें) चरण-दर-चरण, और फिर हमें उस भाग पर लटका दें जिसके लिए वास्तविक कोड की आवश्यकता है। सलाह के लिए धन्यवाद। – 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 डीकोड फ़ंक्शन है, लेकिन ऐप्पल एक स्ट्रिंग लौटने वाले प्रत्येक में से 2-एक चाहता है, फिर एक एन्कोड जो char * और डीकोड देता है जो शून्य * देता है। शून्य * क्यों? वे वापस क्या चाहते हैं?/तो खो गया – WendiKidd

+0

हम्म, लिंक को आगे देखने की कोशिश कर रहा है ... ऐसा लगता है कि अधिकांश उदाहरण एक ही एन्कोडिंग तालिका का उपयोग करते हैं, हालांकि कुछ बड़े डिकोडिंग टेबल का उपयोग करते हैं और अन्य डिकोडिंग टेबल को पॉप्युलेट नहीं करते हैं। तो मैं सोच रहा हूं: अगर एन्कोडिंग टेबल हमेशा एक ही है, तो इसका क्या मतलब है? हैक करना आसान नहीं होगा? उस मामले के लिए, अगर यह हमेशा वही रहता है तो ऐप्पल ने कोड क्यों नहीं लिखा? मैं इस पूरे मामले से बहुत परेशान हूं ... – WendiKidd

+0

यह अजीब बात नहीं है। शायद यह क्रिप्टोग्राफिक कार्यों पर निर्यात प्रतिबंधों के साथ करना है? वैसे भी, मैंने जवाब के लिए एक दूसरा लिंक जोड़ा है जो एक लायक है। बहुत बेहतर व्यवस्था की। –

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