Перехват функции JNI из функций env-> не работает на эмуляторе - PullRequest
0 голосов
/ 09 января 2020

Я начинающий реверс-инженер, и я пытаюсь подключить одну из функций JNI NewStringUTFChars для отладки приложения, чтобы я мог знать строки, преобразованные из java в cpp в приложении. Я знаю, что NewStringUTFChars, GetMethodID, and more. хранится в таблице функций в JNIEnv::functions Так что я перехватил одну из функций из указателя functions с помощью MSHookFunction, пока что код отлично работает на реальном устройстве, но не для эмулятора , поэтому я подумал, что, может быть, перехватил функцию непосредственно из библиотеки, которая, возможно, где-нибудь в / system / lib сделает это. Я попытался проанализировать libart.so, который я взял с обычного устройства (Android 9), и проанализировать его с помощью IDA Pro. Кажется, я не могу найти соответствующую функцию. Затем я попытался захватить libjni.so, который существует в эмуляторе (Android 5), функция существует, но, кажется, libjni.so недоступна в реальном устройстве.

Вот мой полный код:

const char* (*oGetStringUTFChars)(JNIEnv*, jstring, jboolean*);
const char* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* copy)
{
    auto result = oGetStringUTFChars(env, str, copy);

    LOGI("GetStringUTFChars: %s", result);

    return result;
}

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * reserved) {
    JNIEnv *env;
    vm->GetEnv((void **)&env, JNI_VERSION_1_4);
    MSHookFunction((void *)env->functions->GetStringUTFChars, (void *)GetStringUTFChars, (void **)&oGetStringUTFChars);
    return JNI_VERSION_1_4;
}

Это работает для реального устройства, но не для эмулятора, я получаю эту ошибку на logcat

JNI DETECTED ERROR IN APPLICATION: not an array: java.lang.String
    in call to GetArrayLength
    from int com.decodernw.ShellApplication.initialize(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
"main" prio=5 tid=1 Runnable
  | group="main" sCount=0 dsCount=0 obj=0x73d45000 self=0xb3c25800
  | sysTid=3629 nice=0 cgrp=default sched=0/0 handle=0xb774bea0
  | state=R schedstat=( 70652170 13448869 322 ) utm=3 stm=2 core=2 HZ=100
  | stack=0xbf234000-0xbf236000 stackSize=8MB
  | held mutexes= "mutator lock"(shared held)
  native: #00 pc 000063eb  /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+91)
  native: #01 pc 00002f31  /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+33)
  native: #02 pc 0042c41a  /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::mirror::ArtMethod*)+122
  native: #03 pc 003e7f87  /system/lib/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+263)
  native: #04 pc 000f9724  /system/lib/libart.so (art::JniAbort(char const*, char const*)+1588)
  native: #05 pc 000fa272  /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+98)
  native: #06 pc 00316a3c  /system/lib/libart.so (art::JNI::GetArrayLength(_JNIEnv*, _jarray*)+1484)
  native: #07 pc 001a5e9b  /system/lib/libhoudini.so (???)
  native: #08 pc 001976a4  /system/lib/libhoudini.so (???)
  native: #09 pc 001bda74  /system/lib/libhoudini.so (???)
  at com.decodernw.ShellApplication.initialize(Native method)
  at com.decodernw.ShellApplication.initialize(ShellApplication.java:-1)
  at com.decodernw.ShellApplication.Initial(ShellApplication.java:-1)
  at com.decodernw.ShellApplication.attachBaseContext(ShellApplication.java:-1)
  at com.decodernw.mainapp.Application.attachBaseContext(Application.java:-1)
  at android.app.Application.attach(Application.java:181)
  at android.app.Instrumentation.newApplication(Instrumentation.java:996)
  at android.app.Instrumentation.newApplication(Instrumentation.java:980)
  at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526)
  at android.app.ActivityThread.access$1500(ActivityThread.java:151)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:135)
  at android.app.ActivityThread.main(ActivityThread.java:5254)
  at java.lang.reflect.Method.invoke!(Native method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

and many more

Как я могу исправить эту ошибку?

...