Objective-c 中 HEX/Ascii 的二进制哈希表示

Binary hash representation to HEX/Ascii in Objective-c

我想在控制台中记录二进制哈希表示,使用十六进制或 ascii 表示。算法是MD5,所以函数是CC_MD5

我通过 Theos 调整获得二进制哈希表示,效果很好。

编辑: 此调整拦截了 CC_MD5 调用。该调用在下面描述的方法中实现。 CC_MD5调用时,replaced_CC_MD5拦截调用。

测试的应用程序是我自己制作的一个简单的应用程序,它使用这种方法计算 MD5 哈希值:

- (NSString *) md5:(NSString *) input
{
    const char *cStr = [input UTF8String];
    unsigned char digest[16];
    CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return  output;

}

散列没问题,应用 returns 对我来说输入的正确散列

input = prova
MD5 Digest = 189bbbb00c5f1fb7fba9ad9285f193d1

Theos Tweak 中我操作 CC_MD5 函数的函数是

编辑:其中 datacStrlenstrlen(cStr)md 是是 digest.

static unsigned char * replaced_CC_MD5(const void *data, CC_LONG len, unsigned char *md) {
    CC_LONG dataLength = (size_t) len;
    NSLog(@"==== START CC_MD5 HOOK ====");

    // hex of digest
    NSData *dataDigest = [NSData dataWithBytes:(const void *)md length:(NSUInteger)CC_MD5_DIGEST_LENGTH];
    NSLog(@"%@", dataDigest);

    // hex of string
    NSData *dataString = [NSData dataWithBytes:(const void *)data length:(NSUInteger)dataLength];
    NSLog(@"%@", dataString);

    NSLog(@"==== END CC_MD5 HOOK ====");

    return original_CC_MD5(data, len, md);

}

dataString的日志没问题:70726f76 61prova的十六进制表示 dataDigest 的日志是 e9aa0800 01000000 b8c00800 01000000,如果我理解的话,它是 binary 哈希表示。

如何将此表示转换为具有 MD5 哈希摘要?

replaced_CC_MD5 中,您显示 md 调用 original_CC_MD5 之前设置其值。因此,您看到的是随机数据(或最后存储在 md 中的任何数据)。

将对 original_CC_MD5 的调用移到显示语句之前,您应该会看到您期望的值。 (您当然需要将调用结果保存在本地,以便您可以 return return 语句中的值。)