在 Frida 中调用作为参数传递给挂钩函数的 Java 对象的方法

逆向工程 安卓 爪哇 弗里达
2021-06-24 20:03:03

我正在尝试获取传递给decryptAesCipherText 函数的SecretKey。我在 Frida 中挂钩了该函数,以尝试在调用该方法时打印出参数,但由于 SecretKey 是一个对象,因此所有尝试将其打印出来都将输出作为 [object Object]。然而,SecretKey 对象有一个方法 getEncoded() 将返回一个字节数组,该数组可以以十六进制格式打印出来。如何从 Frida 调用此方法并获得结果?

下面给出了我正在挂钩的 java 函数

import javax.crypto.Cipher;
import javax.crypto.SecretKey;

private byte[] decryptAesCipherText(SecretKey secretKey, byte[] bArr) {
        Cipher instance = Cipher.getInstance("AES/ECB/PKCS5Padding");
        instance.init(2, secretKey);
        return decryptCipherText(instance, bArr);
}



用于挂钩函数的 javascript 代码段(不完整)

var target_class = Java.use('com.reactlibrary.securekeystore.RNSecureKeyStoreModule');

target_class.decryptAesCipherText.overload('javax.crypto.SecretKey','[B').implementation = function(key, array){
        console.log("Inside decrypt aes");

        //Call getEncoded method on key to get byte array

        var ret = my_class.decryptAesCipherText.overload('javax.crypto.SecretKey','[B').call(this, key, array);
        return ret;
}
1个回答

您很可能需要访问.value对象的 。或者,您也可以“字符串化”,这很容易理解对象的所有属性。此外,您不需要在重载内部执行重载,只需使用直接调用该方法this.decryptAesCipherText()

您可以使用以下修复程序完成上述所有操作;

var target_class = Java.use('com.reactlibrary.securekeystore.RNSecureKeyStoreModule');

target_class.decryptAesCipherText.overload('javax.crypto.SecretKey','[B').implementation = function(key, array){
        console.log("Inside decrypt aes");

        console.log("key.value : ", key.value);
        console.log("JSON.stringify(key) : ", JSON.stringify(key));

        //Call getEncoded method on key to get byte array
        var ret = this.decryptAesCipherText(key, array);


        console.log("JSON.stringify(ret) : ", JSON.stringify(ret));

        return ret;
}