Frida Android

Frida Scripting Guide (5) - Arrays

Frida Scripting Guide (5) - Arrays

In this post I’ll explain how to use arrays from Java in Frida. Arrays are transformed in Frida from Javascript to Java transparently, so there is no special consideration, as shown in the following examples:

var intArray = [1, 2, 3];
console.log(ArrayType.sumArray(intArray));

This example shows a transformation from a javascript Array to a Java array.

ArrayType.sumArray.overload("[I").implementation = function (arrayList) {
    var total = 0;
    for (var i = 0; i < arrayList.length; i++) {
        total += arrayList[i];
    }
    console.log("Entra en arrayInt sumArray: " + total);
    return total;
}

This method receives an array in Java. When the Frida user writes the reimplementation function, they will receive a Javascript Array.

Warning The forEach structure (used in Javascript) to iterate on an array does not work.

Whenever the following code is called:

var total = 0.0;
arrayList.forEach(function (element) { total += element; });

the frida server generates an error:

TypeError: undefined not callable (property 'forEach' of [object Object])
    at [anon] (../../../frida-gum/bindings/gumjs/duktape.c:65012)
    at /examples.js:278
    at input:1

Working with array of Objects is like working with native types, with the exception that a position in the Array can be null, so it must be taken in consideration when the script is being developed, as in the following example:

var peopleArray = ArrayType.getAllPeople();
for (var i = 0; i < peopleArray.length; i++) {
    if (peopleArray[i] == null) {
        console.log(i + " - null");
    } else {
        console.log(peopleArray[i].getId()+" - "+peopleArray[i].getName() + " - " + peopleArray[i].getAge());    
    }
}

Note A null value in the Java array is translated to a null javascript value automatically by the framework.

Next: Enums