使用 Frida 在 iOS 应用程序中记录 CC_MD5 调用的输入数据和结果哈希

逆向工程 记忆 ios 弗里达 散列函数
2021-07-03 18:46:29

我试图了解在 iOS 应用程序中调用 CC_MD5 的用法。

从 Apple 的手册页我可以看到,当它被调用时,它需要 3 个参数:

extern unsigned char *
CC_MD5(const void *data, CC_LONG len, unsigned char *md);

where*md是指向结果将存储在哪里的指针,也是将返回的内容。

CC_MD5被调用时,我希望能够记录输入数据和结果哈希,并尝试在 Frida 中使用以下脚本,包括在返回指针处打印数据的不同方法:

Interceptor.attach(Module.findExportByName("/usr/lib/libSystem.B.dylib", "CC_MD5"), {
  onEnter: function(args) {
    console.log("[+] CC_MD5 called with *data: " + Memory.readCString(args[0], parseInt(args[1], 16)));
    console.log("[+]                    *len:  " + parseInt(args[1], 16));
    console.log("[+]                    *md:   " + args[2]);
  },
  onLeave: function(retval) {
    console.log("[+] Resulting hash: " + Memory.readCString(ptr(retval),16));
    console.log("[+] Resulting hash: " + retval.readByteArray(16));
    console.log("[+] Resulting hash: " + retval.readCString(16));
  }
});

我知道它并不总是作为输入数据传递给函数的可打印文本,但是在实际读取结果散列时遇到问题。下面是我得到的输出示例:

[+] CC_MD5 called with *data: MGCopyAnswerProductVersion
[+]                    *len:  26
[+]                    *md:   0x16f6d61f0
[+] Returning *md: 0x16f6d61f0
[+] Resulting hash: ��]vU
�)��
[+] Resulting hash: [object ArrayBuffer]
[+] Resulting hash: ��]vU
�)��

我不知道我是否误解了如何CC_MD5调用或我应该可以用 Frida 做什么?

1个回答

您的代码的主要问题是您希望md参数是一个字符串。在 Cunsigned char *中 不是字符串的指示符。相反,它通常用于存储二进制数据。

在这种情况下,md它也只是一个指针,MD5 函数存储它的 16 字节二进制数据。如果您想打印内容,您必须对其进行编码,例如十六进制或 base64。

要打印二进制数据,您可以使用 Frida 的hexdump方法。

或者,您可以自己将二进制数据转换为十六进制字符串并根据您的喜好对其进行格式化:

var a = retval.readByteArray(16)
var b = new Uint8Array(a);
var str = "";

for(var i = 0; i < b.length; i++) {
    str += (b[i].toString(16) + " ");
}
console.log("[+] Resulting hash: " + str);

代码片段的来源