Ios 修补应用程序内购买黑客;卡在第四步

Ios 修补应用程序内购买黑客;卡在第四步,ios,encoding,in-app-purchase,decoding,Ios,Encoding,In App Purchase,Decoding,我们很多人都知道,苹果最近出现了一种情况,黑客可以免费获得任何应用内购买。苹果最近发布了关于如何修补它的说明,但我对第4步有点困惑,如果有任何帮助,我将不胜感激 第一步是下载他们的补丁.h和.m,将其包含在项目中,并将其与安全框架相链接。好的,很好,明白了。然后苹果说: 4。提供base64编码器、base64解码器以及验证成功时要执行的操作。 关于编码器的部分到底意味着我应该做什么?(验证成功时要执行的操作对我来说很清楚。)我当然可以在类中看到名为base64_encode和base64_de

我们很多人都知道,苹果最近出现了一种情况,黑客可以免费获得任何应用内购买。苹果最近发布了关于如何修补它的说明,但我对第4步有点困惑,如果有任何帮助,我将不胜感激

第一步是下载他们的补丁.h和.m,将其包含在项目中,并将其与安全框架相链接。好的,很好,明白了。然后苹果说:

4。提供base64编码器、base64解码器以及验证成功时要执行的操作。

关于编码器的部分到底意味着我应该做什么?(验证成功时要执行的操作对我来说很清楚。)我当然可以在类中看到名为
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*
s,但是为什么第二对返回
char*
void*
?这些函数预期返回什么?我真的不明白

听起来他们想要一个通用的base64编码器。请在此处尝试一些代码:

(免责声明:我没有测试过任何内容)

下面是第二个更容易阅读的:

请看一个由未知作者发布的解决方案:

其中包含以下代码,我已测试并为我工作:

//  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;
}
//单base64字符转换
静态整数位置(字符c)
{
如果(c>='A'&&c='A'&&c='0'&&c>18];
*p++=base64[(c&0x0003f000)>>12];
如果(i>大小+1)
*p++='=';
其他的
*p++=base64[(c&0x00000fc0)>>6];
如果(i>大小)
*p++='=';
其他的
*p++=base64[c&0x0000003f];
}
*p=0;
返回str;
}
void*base64\u解码(常量字符*s,大小*数据长度*ptr)
{
尺寸长度=标准长度;
如果(len%4)
[N异常提升:@“base64_解码中的无效输入”格式:@“%d是base64解码输入字符串的无效长度”,len];
无符号字符*数据=(无符号字符*)malloc(len/4*3);
int n[4];
无符号字符*q=(无符号字符*)数据;
对于(常量字符*p=s;*p;)
{
n[0]=POS(*p++);
n[1]=POS(*p++);
n[2]=POS(*p++);
n[3]=POS(*p++);
如果(n[0]=-1 | | n[1]=-1)
[N异常提升:@“base64_解码中的无效输入”格式:@“无效base64编码”];
如果(n[2]==-1&&n[3]!=-1)
[N异常提升:@“base64_解码中的无效输入”格式:@“无效base64编码”];
q[0]=(n[0]>4);
如果(n[2]!=-1)q[1]=((n[1]&15)>2);

如果(n[3]!=-1)q[2]=((n[2]&3)如果你是注册开发者,我会使用你的一个苹果支持电话(你每年会收到两个-使用它们或丢失它们)。这一点太重要了,不能犯错误或使用可能不正确的建议。@嗯,这是个好主意。我觉得奇怪的是,苹果没有在他们给我们的网页上添加一些解释。他们解释了简单的事情(下载代码,将其添加到您的项目中)一步一步,然后让我们在需要实际代码的部分挂起。谢谢你的建议。你检查过他的网站吗?它说他已经找到了一个验证控制器的解决方法。我们应该花时间来实现这个快速修复吗?@PreetKamalMinhas我找不到他网站上说的地方。你能链接我吗是吗?谢谢!该页面上的代码格式非常糟糕,因此我在阅读时遇到困难。(即,应该是代码的行的格式与代码不同,不是代码的行的格式与代码相同,很难看到示例的开头和结尾…)我真的很感激你给我指出了正确的方向,但我认为我还没有找到答案。我也很困惑,这个链接上的示例有一个encode和一个decode函数,但苹果想要其中的两个,分别返回一个字符串,然后一个encode返回char*和decode返回void*。为什么void*?他们想要什么ned?/so Losthm,还试图进一步查看链接……似乎大多数示例都使用相同的编码表,尽管一些示例使用巨大的解码表,而其他示例似乎根本没有填充解码表。因此我想知道:如果编码表总是相同的,那它有什么意义?黑客不是很容易吗呃,如果总是一样的话,为什么苹果不直接编写代码呢?我对这整件事感到非常困惑……这很奇怪,不是吗。也许是因为密码功能的出口限制?无论如何,我已经添加了第二个链接到答案,值得一看。安排得更好。@WendiKidd苹果以优秀的产品和垃圾而闻名py文档。他们所有的文档,无一例外,都是以模糊的方式写的,不完整的,可疑的或者所有这些选项都在一起。如果他们能再创建一个模糊的文档,为什么他们要提供一个完整的解决方案呢?顺便说一句,我讨厌他们的文档。如果网络上没有像这样的论坛,我们就注定要失败。我们的运气是,我们有一个特殊的网站能够理解苹果使用的克林贡语的程序员。感谢大家在这方面的帮助。该链接直接从这个问题()中删除了内容,这实际上是这个问题的副本……不过,我还没有机会查看代码。我会这样做,然后再与您联系;谢谢:)