frida-java-bridge
frida-java-bridge copied to clipboard
Edit static final class variable
There's this class in an Android app:
package com.example;
public final class ExampleClass
{
public static final String[] EDITME;
static {
EDITME = new String[] { "TODO: remove me" };
}
}
I would like to replace EDITME
by an empty array instead of the array with "TODO: remove me"
inside of it. I tried to do that with reflection:
Java.perform(function() {
Java.deoptimizeEverything();
var ExampleClass = Java.use("be.argenta.bankieren.BuildConfig");
var field = ExampleClass.class.getDeclaredField("EDITME");
field.setAccessible(true);
var Field = Java.use("java.lang.reflect.Field");
var Modifier = Java.use("java.lang.reflect.Modifier");
var Array = Java.use("java.lang.reflect.Array");
var String = Java.use("java.lang.String");
var ObjectJ = Java.use("java.lang.Object");
var arr = Java.array("java.lang.String", []);
// var arr = Array.getNewInstance(String.class, 0);
// ^ does not work because there are no methods on Array?
field.set(null, arr);
console.log("alive");
});
This does not seem to work: Frida complains (and rightfully so) that Error: set(): argument types do not match any of: .overload('java.lang.Object', 'java.lang.Object')
(the second argument is not an Object, but an array). When I try to uncomment the commented line, it tells me TypeError: undefined not callable (property 'getNewInstance' of [object Object])
, there also don't seem to be any methods on Array.
Is there an easier way to set static final variables in a class in Frida?
any update ?
any update ?
I have the same problem
`
var Inet6Address=Java.use("java.net.Inet6Address");
var Inet4Address=Java.use("java.net.Inet4Address");
var InetAddress=Java.use("java.net.InetAddress");
var ipv4 = Java.array('byte', [ 0x0,0x0,0x0,0x0]);
var ipv4_obj=Inet4Address.$new("192.168.88.88",ipv4);
var ipv6 = Java.array('byte', [ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]);
var ipv6_obj=Inet4Address.$new("fe80::20a:f5ff:fef9:23ff%wlan0",ipv6);
var my_addrs=Java.array("java.net.InetAddress",[ipv6_obj,ipv4_obj]);
NetworkInterface.getHardwareAddress.overload().implementation = function () {
////console.log("[*]****************call NetworkInterface.getHardwareAddress********************");
var name = this.getName();
////console.log(name);
if (name == "wlan0") {
//var ret = this.getHardwareAddress();
//var arr = Java.use("java.util.Arrays");
console.log("[*]HOOK MAC");
var addrs_f=this.getClass().getDeclaredField("addrs");
addrs_f.setAccessible(true);
addrs_f.set(this,my_addrs);`
{'type': 'error', 'description': "Error: set(): argument types do not match any of:\n\t.overload('java.lang.Object', 'java.lang.Object')",