Как подключить нативную раздетую библиотеку с помощью frida?

Внутри java он вызывает встроенную функцию из something.so:

public static native byte[] functionName(int i, byte[] bArr);

Как видите, эта функция должна возвращать массив байтов. Итак, я попробовал это:

Interceptor.attach (Module.findExportByName ( "something.so", "functionName"), {
    onEnter: function (args) 
    {
            console.log("entered");
            var ptr_data = env.getClassName(args[1]);
            var length = args[2];
            var data = Memory.readByteArray(ptr_data, length);
            console.log(data);
    }   
    });

Но Фрида не может вернуть никакого результата. Даже печать «вошла». Обратите внимание, что вы не можете увидеть имя «functionName», если открываете с помощью ida, потому что оно было удалено elf (.so)
Я понятия не имею, где находится это местоположение «functionName», и я хочу найти его, потому что оно содержит много мусорных кодов.

Есть ли другой способ найти это с помощью frida? Напишите пример и поделитесь со мной.


person Gin May    schedule 21.10.2019    source источник
comment
Ваш пост меня смущает. С одной стороны, вы говорите о классах (что обычно означает классы Java) - с другой стороны, вы используете код для подключения собственных (например, C / C ++ и, следовательно, не-Java) методов.   -  person Robert    schedule 22.10.2019
comment
@Robert благодарит за решение проблемы. Я отредактировал сообщение, я хотел сказать, что в классе java он называется собственной функцией functionName   -  person Gin May    schedule 23.10.2019
comment
Вы должны указать более подробную информацию - точные имена классов, методов и функций, иначе, скорее всего, вы не получите ответов, потому что неясно, в чем проблема.   -  person Robert    schedule 23.10.2019
comment
Других подсказок нет, это раздетый эльф, ты ничего не увидишь внутри с помощью ida   -  person Gin May    schedule 23.10.2019
comment
чего нет ничего? Обычно вы получаете хотя бы список функций, а может и без имен. Если вы пытаетесь использовать экспортированную функцию, я предполагаю, что есть список экспортированных методов.   -  person Robert    schedule 23.10.2019
comment
@Robert, у него много функциональных разделов, но ты никогда не знаешь, какой из них настоящий. Да, есть экспортированный метод, но он выходит за пределы видимой функции. Но когда вы просматриваете вкладку экспорта, вы никогда не видите настоящего имени .. Здесь вы можете посмотреть, что я имею в виду drive.google.com/open?id=1G_RQHNPqJUdTUDZDMehjcTuICizJJUc5   -  person Gin May    schedule 24.10.2019
comment
также я хотел спросить, как просмотр таблицы экспорта позволил нам найти функцию?   -  person Gin May    schedule 25.10.2019


Ответы (1)


Его можно зарегистрировать изначально, и он не будет экспортирован, что означает, что вы не увидите его с Module.enumerateExports

Этот фрагмент перехватит JNI RegisterNatives и покажет смещение functionName, которое yoy может перехватить через Module.findBaseAddress('something.so').add(offset)

registerNativeMethods может использоваться против техники защиты от реверса в собственных библиотеках .so, например максимально возможное скрытие символов, затемнение экспортируемых символов и, в конечном итоге, добавление некоторой защиты через мост JNI. Найти вручную зарегистрированный (скрытый) собственный адрес функции

var RevealNativeMethods = function() {
  var pSize = Process.pointerSize;
  var env = Java.vm.getEnv();
  var RegisterNatives = 215, FindClassIndex = 6; // search "215" @ https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html
  var jclassAddress2NameMap = {};
  function getNativeAddress(idx) {
    return env.handle.readPointer().add(idx * pSize).readPointer();
  }
  // intercepting FindClass to populate Map<address, jclass>
  Interceptor.attach(getNativeAddress(FindClassIndex), {
    onEnter: function(args) {
      jclassAddress2NameMap[args[0]] = args[1].readCString();
    }
  });
  // RegisterNative(jClass*, .., JNINativeMethod *methods[nMethods], uint nMethods) // https://android.googlesource.com/platform/libnativehelper/+/master/include_jni/jni.h#977
  Interceptor.attach(getNativeAddress(RegisterNatives), {
    onEnter: function(args) {
      for (var i = 0, nMethods = parseInt(args[3]); i < nMethods; i++) {
        /*
          https://android.googlesource.com/platform/libnativehelper/+/master/include_jni/jni.h#129
          typedef struct {
             const char* name;
             const char* signature;
             void* fnPtr;
          } JNINativeMethod;
        */
        var structSize = pSize * 3; // = sizeof(JNINativeMethod)
        var methodsPtr = ptr(args[2]);
        var signature = methodsPtr.add(i * structSize + pSize).readPointer();
        var fnPtr = methodsPtr.add(i * structSize + (pSize * 2)).readPointer(); // void* fnPtr
        var jClass = jclassAddress2NameMap[args[0]].split('/');
        console.log('\x1b[3' + '6;01' + 'm', JSON.stringify({
          module: DebugSymbol.fromAddress(fnPtr)['moduleName'], // https://www.frida.re/docs/javascript-api/#debugsymbol
          package: jClass.slice(0, -1).join('.'),
          class: jClass[jClass.length - 1],
          method: methodsPtr.readPointer().readCString(), // char* name
          signature: signature.readCString(), // char* signature TODO Java bytecode signature parser { Z: 'boolean', B: 'byte', C: 'char', S: 'short', I: 'int', J: 'long', F: 'float', D: 'double', L: 'fully-qualified-class;', '[': 'array' } https://github.com/skylot/jadx/blob/master/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java
          address: fnPtr
        }), '\x1b[39;49;00m');
      }
    }
  });
}

Java.perform(RevealNativeMethods);
person whoopdedoo    schedule 03.11.2019