Я начинающий реверс-инженер, и я пытаюсь подключить одну из функций 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
Как я могу исправить эту ошибку?