Вызов метода объекта Java, переданного в качестве аргумента связанной функции в Frida

Я пытаюсь получить SecretKey, переданный функции decryptAesCipherText. Я подключил функцию в Frida, чтобы попытаться распечатать аргументы при вызове метода, но поскольку SecretKey является объектом, все попытки распечатать его дают результат как [object Object]. Однако у объекта SecretKey есть метод getEncoded (), который возвращает массив байтов, который можно распечатать в шестнадцатеричном формате. Как мне вызвать этот метод у Фриды и получить результат?

Функция 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;
}

person Abin K Paul    schedule 31.05.2020    source источник


Ответы (1)


Похоже, вы не можете вызвать getEncoded в javax.crypto.SecretKey интерфейсе.

Обычно параметр SecretKey имеет тип javax.crypto.spec.SecretKeySpec, и если вы наберете приведение ключевого параметра к SecretKeySpec, вы можете вызвать getEncoded() и распечатать используемый ключ:

function encodeHex(byteArray) {
    const HexClass = Java.use('org.apache.commons.codec.binary.Hex');
    const StringClass = Java.use('java.lang.String');
    const hexChars = HexClass.encodeHex(byteArray);
    return StringClass.$new(hexChars).toString();
}

Java.perform(function x() {
    const target_class = Java.use('com.example.myapplication.MainActivity');
    target_class.decryptAesCipherText.overload('javax.crypto.SecretKey', '[B').implementation = function (key, array) {
        console.log("Inside decrypt aes");

        const secretKeySpec = Java.cast(key, Java.use('javax.crypto.spec.SecretKeySpec'));
        const encodedKey = secretKeySpec.getEncoded();

        // print the key bytes as hex value
        console.log("KEY: " + encodeHex(encodedKey));

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

});
person Robert    schedule 01.06.2020
comment
в моем случае кастинг на javax.crypto.spec.SecretKeySpec не работал! но преобразование в java.security.Key действительно сработало! в любом случае вверх :) - person arman; 01.06.2020
comment
Спасибо за решение. Работает отлично. Еще один вопрос. Разве вообще нельзя вызывать методы на интерфейсах из Фриды или просто в этом случае? - person Abin K Paul; 02.06.2020
comment
@AbinKPaul ​​Это хороший вопрос. У меня нет большого опыта работы с интерфейсами, но, как вы обнаружили, приведение типов к java.security.Key работает. Поскольку это супер-интерфейс SecretKey и интерфейс, который определяет getEncoded(), возможно, что в интерфейсах вам придется использовать интерфейс, определяющий метод (может быть проблема наследования интерфейса в Frida?). - person Robert; 03.06.2020
comment
У метода интерфейса нет тела, поэтому мы не можем его вызвать! Это набор абстрактных методов. tutorialspoint.com/java/java_interfaces.htm. но преобразование в них возможно, и поскольку я преобразовал key в java.security.Key, я могу вызвать методы класса kes. даже в чистом java кастинге key в javax.crypto.spec.SecretKeySpec не работало! - person arman; 04.06.2020