gpt4 book ai didi

objective-c - EXC_BAD_ACCESS 尝试取消混淆 unsigned char 数组并将其转换为 NSString

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:23 24 4
gpt4 key购买 nike

我有一个简单的类,它使用 SHA-512 来混淆/取消混淆字符串。混淆后的字符串存储为无符号字符数组,并且在运行时通过与某些 key 字符串的 SHA 散列进行异或运算来解除混淆。这是这个类的样子:

#import "Obfuscator.h"
#include <CommonCrypto/CommonCrypto.h>

static unsigned char firstKey[] = {0x7, 0x86, 0xF6, 0xAB, 0xFD, 0xC1, 0x86, 0xAD, 0x9B, 0x9E, 0xAA, 0xE9, 0x10, 0x54, 0x2D, 0x74, 0x11, 0x63, 0x7, 0xE8};

static unsigned char secondKey[] = {0x1E, 0x9A, 0xB4, 0xED, 0x9D, 0xE6, 0x91, 0xA7, 0x87, 0x9C, 0x91, 0xB3, 0x40};

static unsigned char thirdKey[] = {0xB, 0x91, 0xF7, 0xED, 0xA6, 0xA1, 0x91, 0x9A, 0xDA, 0x88, 0xAA, 0x94, 0x4B, 0x12, 0xB, 0x74};

@implementation Obfuscator

- (void)test
{
NSString *just = [self stringFromEncryptedKey:firstKey ofLength:sizeof(firstKey)];
NSString *try = [self stringFromEncryptedKey:secondKey ofLength:sizeof(secondKey)];
NSString *this = [self stringFromEncryptedKey:thirdKey ofLength:sizeof(thirdKey)];
}

- (NSString *)stringFromEncryptedKey:(unsigned char *)key ofLength:(int)length
{
unsigned char *obfuscator = malloc(length * sizeof(unsigned char));

NSData *encryptionData = [@"MyTopSecretEncryptionKey"
dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA512(encryptionData.bytes, (CC_LONG)encryptionData.length, obfuscator);

unsigned char *unobfuscated = malloc(length * sizeof(unsigned char)); ;
for (int i = 0; i < length; i++) {
unobfuscated[i] = key[i] ^ obfuscator[i];
}

NSString *result = [[NSString alloc] initWithBytes:unobfuscated length:length encoding:NSASCIIStringEncoding];

NSLog(@"%@", result);

free(obfuscator);
free(unobfuscated);

return result;
}

@end

当我运行这段代码并调用测试方法时,我遇到了各种内存错误。如果没有 malloc guard,我会在某个时候收到“释放对象的校验和不正确 - 对象可能在释放后被修改”错误,通常是在第一个 key 未被混淆并记录到控制台时。如果启用了 malloc guard,则在计算 SHA-512 哈希值时,执行将停止并返回 EXC_BAD_ACCESS。我不确定如何调试这类东西。有什么建议吗?

最佳答案

错误一:SHA512输出长度:
不正确:unsigned char *obfuscator = malloc(length * sizeof(unsigned char));
正确:unsigned char *obfuscator = malloc(CC_SHA512_DIGEST_LENGTH);

错误 2:任意数据不一定是 NSASCIIStringEncoding,Base64 是更好的选择。

错误 3:result 是使用 unobfuscated 创建的,可能应该是 obfuscated

示例代码:

- (NSString *)stringFromEncryptedKey:(unsigned char *)key ofLength:(int)length {
NSMutableData *unobfuscatedData = [NSMutableData dataWithBytes:key length:length * sizeof(unsigned char)];
NSMutableData *obfuscatedData = [NSMutableData dataWithLength:length * sizeof(unsigned char)];
unsigned char *unobfuscated = unobfuscatedData.mutableBytes;
unsigned char *obfuscated = obfuscatedData.mutableBytes;

NSMutableData *obfuscatorData = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH];
unsigned char *obfuscator = obfuscatorData.mutableBytes;

NSData *encryptionData = [@"MyTopSecretEncryptionKey" dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA512(encryptionData.bytes, (CC_LONG)encryptionData.length, obfuscator);

for (int i = 0; i < length; i++) {
obfuscated[i] = obfuscator[i] ^ unobfuscated[i];
}

NSString *result = [obfuscatedData base64EncodedStringWithOptions:0];

NSLog(@"result: %@", result);

return result;
}

输出:

result: TXkxMjNTZWNyZXQ0NTZTdHJpbmc=
result: VGVzdFN0cmluZ09uZQ==
result: QW4wdGgzclQzc3RJbnB1dA==

关于objective-c - EXC_BAD_ACCESS 尝试取消混淆 unsigned char 数组并将其转换为 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26853836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com