函数无法被 Frida 钩住

Posted

技术标签:

【中文标题】函数无法被 Frida 钩住【英文标题】:Function is unhookable by Frida 【发布时间】:2021-12-08 02:35:18 【问题描述】:

我有以下 Java 代码,我正在尝试挂钩 getTimeZone 函数:

package com.myapp.models;

public class User 

    private String timeZone;

    public void setTimeZone(String str) 
        this.timeZone = str;
    

    public String getTimeZone() 
        return this.timeZone;
    

这是我正在尝试使用的 frida 代码:

Java.perform(function () 

    var User = Java.use("com.myapp.models.User");
    User.getTimeZone.implementation = function() 
        console.log("timezone requested")
        return 12;
    ;

);

但是,由于应用程序在 getTimezone 上崩溃而不返回值,因此该挂钩似乎没有发生:

10-21 12:17:23.013 26553 26553 E androidRuntime: Process: com.myapp.android, PID: 26553
10-21 12:17:23.013 26553 26553 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.myapp.models.User.getTimeZone()' on a null object reference
10-21 12:17:23.013 26553 26553 E AndroidRuntime:        at com.myapp.features.home.logs.updateChart(Presenter.java:370)
10-21 12:17:23.013 26553 26553 E AndroidRuntime:        at com.myapp.features.home.logs.loadGraph(Presenter.java:217)
10-21 12:17:23.013 26553 26553 E AndroidRuntime:        at com.myapp.features.home.logs.onResume(Fragment.java:313)

我知道这个函数没有错别字,自从我在frida中运行后就识别成功了:

[Redmi Note 7::myapp]-> Java.use("com.myapp.models.User").getTimeZone
function
[Redmi Note 7::myapp]-> Java.use("com.myapp.models.User").getTimeZone.implementation
"0x7e3682a128"

【问题讨论】:

【参考方案1】:

你的 Frida 代码有一个主要问题:

getTimeZone 的定义是String getTimeZone(),因此你必须返回一个String

但您的 Frida 代码返回一个 int 值:return 12;

将其更改为 return "12";,您的 Frida 代码应该可以工作了。

在定义User 类的Android 应用程序中可能存在第二个问题(在com.myapp.features.home.logs.updateChart 方法之一中,您没有包含在您的问题中)。基于异常

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 java.lang.String com.myapp.models.User.getTimeZone()'

应用程序似乎调用getTimeZone() 而不首先构造User() 实例。除非您更正 Frida 挂钩代码无法正常工作。

【讨论】:

非常感谢您,但我不太明白您的第二个建议,因为我正在反转现有应用程序并且调用此函数的代码有效。这是调用 getTimeZone 的代码行: Session.getInstance().getUser().getTimeZone();那么除了将返回值 12 更改为 "12" 之外,是否需要更改 frida 代码? —— @toothpick 您不必对您的 Frida 代码进行更多更改。我不确定您得到的异常是否是由错误的返回类型引起的,或者这是您正在挂钩的应用程序的错误。我的第一印象是Session.getInstance().getUser() 返回null 所以getTimeZone() 总是会失败(并且Frida 代码永远不会触发)。确保您已登录要挂接的应用程序。 getUser 确实为空,这个错误现在很有意义。非常感谢?

以上是关于函数无法被 Frida 钩住的主要内容,如果未能解决你的问题,请参考以下文章

IAT 钩住但钩住的函数没有被调用

怎样用frida直接调用函数

在Wordpress中列出钩住的函数

Frida - Windows 原生应用程序 - 读取 Wininet.h 公开的结构

frida native层 hook的思路技巧

frida native层 hook的思路技巧