【问题标题】:Read uchar value from hooked method using Frida使用 Frida 从 hooked 方法中读取 uchar 值
【发布时间】: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 中的外观:

在输出中我得到未知字符而不是实际值

这样做的正确方法是什么?

【问题讨论】:

    标签: javascript c++ reverse-engineering frida


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多