希望修改从枚举类型调用的方法的返回值。我能够调用该方法并将枚举值正确显示到控制台中,但随后它会导致应用程序崩溃,并抱怨兼容的实现。下面的示例代码有错误:
Java.perform(() => {
const Class = Java.use('com.package.class');
Class.getMethod.implementation = function() {
var str = this.getMethod();
send('getMethod() value for enum is: ' + str);
};
});
[Pixel 5::com.package ]-> message: {'type': 'send', 'payload': 'getMethod() value for enum is: EnumContent'} data: None
Error: Implementation for getMethod expected return value compatible with [Lcom.com.package.EnumType;
at ne (frida/node_modules/frida-java-bridge/lib/class-factory.js:674)
at <anonymous> (frida/node_modules/frida-java-bridge/lib/class-factory.js:651)
Process terminated
我的最终目标是获取初始枚举值,更改方法摄取的枚举返回值并将结果显示在控制台中。
我在这里找到了一些参考:https://github.com/frida/frida/issues/1256和这里:https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting -guide/enums 但最终未能成功提供帮助。
编辑: 用一个例子来详细说明。假设您正在尝试使用如下所示的 JS 脚本和 return 或 console.log:
Java.perform(() => {
var enumContent = Java.use('com.some.package.Enum');
return enumContent.values();
)};
或
Java.perform(() => {
var enumContent = Java.use('com.some.package.Enum');
console.log(enumContent.A.value);
)};
假设您的 Java 代码如下所示:
package com.some.package;
import kotlin.Metadata;
public enum Enum {
A,
B,
C,
D
}
编辑2:
这是该课程的片段。
package com.package.class;
[TRUNCATED]
...
[TRUNCATED]
@NotNull
public final Enum[] getMethod() {
return this.selection;
}
}
您的主要问题是,如果您挂钩 Java 方法,您会自动替换该方法。因此,如果该方法具有
void
以外的返回类型,您就被迫以某种方式提供与返回类型匹配的返回值:
不确定以下代码是否直接有效,但它演示了为什么您必须返回一个新的
Enum[]
:
Java.perform(() => {
const myClass = Java.use('com.package.class');
const enumContent = Java.use('com.some.package.Enum');
myClass.getMethod.implementation = function() {
var str = this.getMethod();
send('getMethod() value for enum is: ' + str);
// you need to return a value of the type Enum[]
return Java.array('com.some.package.Enum', [ enumContent.A.value ]);
};
});