函数无法被 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 钩住的主要内容,如果未能解决你的问题,请参考以下文章