使用 Frida 从 hooked 方法中读取 uchar 值
Posted
技术标签:
【中文标题】使用 Frida 从 hooked 方法中读取 uchar 值【英文标题】:Read uchar value from hooked method using Frida 【发布时间】:2021-09-15 14:01:04 【问题描述】:如何读取 uchar* 的值?
我尝试了很多方法,这是我使用的代码:
Interceptor.attach(Module.getExportByName('libsigning.so', 'EVP_DigestSignFinal'),
onEnter: function (args)
console.log("RSA.doFinal() [VALID]")
console.log("arg0: OpenSSL object")
console.log("arg1: " + Memory.readUtf8String(args[1]))
console.log("arg2: " + args[2].readUInt())
,
onLeave: function (retval)
// simply replace the value to be returned with 0
return retval
);
我得到了什么:
RSA.doFinal() [VALID]
arg0: RSA object
arg1:
arg2: 512
它在 ghidra 中的外观:
在输出中我得到未知字符而不是实际值
这样做的正确方法是什么?
【问题讨论】:
【参考方案1】:你钩的方法是documented
int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen);
根据它的文档,第二个参数接收创建的签名:
在 ctx 中对数据进行签名,并将签名放在 sig 中。如果 sig 为 NULL 然后将输出缓冲区的最大大小写入 siglen 范围。如果 sig 不为 NULL,那么在调用 siglen 之前 参数应包含 sig 缓冲区的长度。如果来电是 成功将签名写入sig和数据量 写给 siglen。
(加密)签名是二进制数据,在 C 中,unsigned char
类型通常用于存储此类二进制数据。因此,即使它包含名称 char
,您也不会在其中找到任何可打印的字符或完整的字符串。
因此,如果您想将其打印为字符串,它将失败,因为“实际值”是二进制数据。
要读取二进制数据,您可以使用来自 NativePointer 的 Frida readByteArray
【讨论】:
以上是关于使用 Frida 从 hooked 方法中读取 uchar 值的主要内容,如果未能解决你的问题,请参考以下文章