frida-java-bridge icon indicating copy to clipboard operation
frida-java-bridge copied to clipboard

Edit static final class variable

Open redfast00 opened this issue 4 years ago • 2 comments

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?

redfast00 avatar Jul 18 '20 22:07 redfast00

any update ?

iddoeldor avatar Sep 24 '20 08:09 iddoeldor

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')",

0xjacklove avatar May 10 '21 11:05 0xjacklove