使用 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 值的主要内容,如果未能解决你的问题,请参考以下文章

Frida之app逆向hook,动态插装

初识Frida--Android逆向之Java层hook

App静态逆向分析思路浅析(过检测)

Frida-延迟Hook方法

作为初使用frida hook apk者遇见的问题 2018/7/22/12:48

Frida 逆向hook方法传参