Ios 修补应用程序内购买黑客;卡在第四步
我们很多人都知道,苹果最近出现了一种情况,黑客可以免费获得任何应用内购买。苹果最近发布了关于如何修补它的说明,但我对第4步有点困惑,如果有任何帮助,我将不胜感激 第一步是下载他们的补丁.h和.m,将其包含在项目中,并将其与安全框架相链接。好的,很好,明白了。然后苹果说:Ios 修补应用程序内购买黑客;卡在第四步,ios,encoding,in-app-purchase,decoding,Ios,Encoding,In App Purchase,Decoding,我们很多人都知道,苹果最近出现了一种情况,黑客可以免费获得任何应用内购买。苹果最近发布了关于如何修补它的说明,但我对第4步有点困惑,如果有任何帮助,我将不胜感激 第一步是下载他们的补丁.h和.m,将其包含在项目中,并将其与安全框架相链接。好的,很好,明白了。然后苹果说: 4。提供base64编码器、base64解码器以及验证成功时要执行的操作。 关于编码器的部分到底意味着我应该做什么?(验证成功时要执行的操作对我来说很清楚。)我当然可以在类中看到名为base64_encode和base64_de
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文档。他们所有的文档,无一例外,都是以模糊的方式写的,不完整的,可疑的或者所有这些选项都在一起。如果他们能再创建一个模糊的文档,为什么他们要提供一个完整的解决方案呢?顺便说一句,我讨厌他们的文档。如果网络上没有像这样的论坛,我们就注定要失败。我们的运气是,我们有一个特殊的网站能够理解苹果使用的克林贡语的程序员。感谢大家在这方面的帮助。该链接直接从这个问题()中删除了内容,这实际上是这个问题的副本……不过,我还没有机会查看代码。我会这样做,然后再与您联系;谢谢:)