如何使用 Frida 在 Android 中从挂钩的本机函数中打印变量

Posted

技术标签:

【中文标题】如何使用 Frida 在 Android 中从挂钩的本机函数中打印变量【英文标题】:How to print variable from hooked native function in Android using Frida 【发布时间】:2019-10-08 22:47:38 【问题描述】:

我有一个加载mylib.soandroid 应用程序。这个库有一个名为decryptChar 的函数,我想钩住并打印一个在那里计算的字符串变量。我为此使用frida。我做了一些尝试,但鉴于我在这方面缺乏经验,一切都失败了。我想在离开函数之前打印变量Key,以便获得它的最终值。

我使用的代码如下

Interceptor.attach(Module.findExportByName("mylib.so", "decryptChar"), 
    onEnter: function (args) 
        console.log(this.Key.value);
    
);

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

【问题讨论】:

有人知道如何回答这个问题吗? 【参考方案1】:

你混合了一些东西

onLeave 参数为返回值,this 用于从onEnter 传递数据

如果你想打印静态方法的第一个参数,假设它是一个指向字符串的指针

Interceptor.attach(Module.findExportByName("mylib.so", "decryptChar"), 
    onEnter: function (args) 
        console.log(args[0].readCString());
    
);

阅读文档@https://www.frida.re/docs/javascript-api/#instruction

【讨论】:

是的,确实onLeave 使用不正确。虽然我想打印一个变量而不是一个参数,并且使用文档中提到的.value 不起作用【参考方案2】:

您不能打印局部变量。您应该挂钩变量的使用站点。如果在decryptChar另一个函数调用中使用了该变量,则应该挂钩该函数。如果您想查看decryptChar中的变量作为参数调用了什么函数,最好使用ida pro之类的反汇编程序,因为您要挂钩的函数在.so库中定义。

例如,使用来自decryptChar() 的变量作为参数调用write() 函数,则挂钩write() 函数调用。然后,您可以打印该变量。

【讨论】:

以上是关于如何使用 Frida 在 Android 中从挂钩的本机函数中打印变量的主要内容,如果未能解决你的问题,请参考以下文章

Android使用Frida挂钩抽象类方法调用

你如何使用 frida 挂钩一个原生的剥离库?

如何在状态挂钩中从获取请求中设置数据(对象数组)?

使用 Frida 在当前类中设置成员

安装使用Frida在Android上进行hook

从 Frida 的非主线程调用 API 来修改应用程序的 GUI