У меня есть приложение, которое шифрует файл classes.dex в приложениях для Android для обратной защиты.После расшифровки classes.dex динамически загружается из памяти, но у меня проблемы с android 4.4 KitKat (api level 19).После запуска зашифрованного apk на эмуляторе (AVD от студии Android) он вылетает.
Проблема в этом куске кода:
jint mCookie = mem_loadDex_dvm(env, (char *)szDexPath);
// error appears in line below
jclass DexFileClass = env->FindClass("dalvik/system/DexFile");
строка в github
точно, если перейти в функцию mem_loadDex_dvm, проблема появляется после этой строки
openDexFile(args, &pResult);
строка в github
Текст ошибки:
W/dalvikvm: JNI WARNING: JNI function FindClass called with exception pending
W/dalvikvm: in Lcom/storm/fengyue/Native;.attachBaseContext:(Landroid/content/Context;)V (FindClass)
W/dalvikvm: Pending exception is:
I/dalvikvm: java.lang.RuntimeException: unable to open in-memory DEX file
I/dalvikvm: at com.storm.fengyue.Native.attachBaseContext(Native Method)
I/dalvikvm: at com.storm.fengyue.StubApplication.attachBaseContext(StubApplication.java:105)
I/dalvikvm: at android.app.Application.attach(Application.java:181)
I/dalvikvm: at android.app.Instrumentation.newApplication(Instrumentation.java:991)
I/dalvikvm: at android.app.Instrumentation.newApplication(Instrumentation.java:975)
I/dalvikvm: at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
I/dalvikvm: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4317)
I/dalvikvm: at android.app.ActivityThread.access$1500(ActivityThread.java:135)
I/dalvikvm: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
I/dalvikvm: at android.os.Handler.dispatchMessage(Handler.java:102)
I/dalvikvm: at android.os.Looper.loop(Looper.java:136)
I/dalvikvm: at android.app.ActivityThread.main(ActivityThread.java:5017)
I/dalvikvm: at java.lang.reflect.Method.invokeNative(Native Method)
I/dalvikvm: at java.lang.reflect.Method.invoke(Method.java:515)
I/dalvikvm: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
I/dalvikvm: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
I/dalvikvm: at dalvik.system.NativeStart.main(Native Method)
I/dalvikvm: "main" prio=5 tid=1 NATIVE
I/dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x9cd62bd8 self=0xb8d0e4a0
I/dalvikvm: | sysTid=2388 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1216544672
I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=16 stm=0 core=3
I/dalvikvm: #00 pc 000bd4b6 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+86)
I/dalvikvm: #01 pc 00098093 /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+1155)
I/dalvikvm: #02 pc 00098386 /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+86)
I/dalvikvm: #03 pc 0004ce17 /system/lib/libdvm.so (ScopedCheck::checkThread(int)+455)
I/dalvikvm: #04 pc 000601e5 /system/lib/libdvm.so
I/dalvikvm: #05 pc 00008a26 /data/data/home.blank/files/.jiagu/libdexload.so (mem_loadDex(_JNIEnv*, _jobject*, char const*)+1334)
I/dalvikvm: #06 pc 00009158 /data/data/home.blank/files/.jiagu/libdexload.so (native_attachBaseContext(_JNIEnv*, _jobject*, _jobject*)+1096)
I/dalvikvm: #07 pc 0002a0eb /system/lib/libdvm.so (dvmPlatformInvoke+79)
I/dalvikvm: at com.storm.fengyue.Native.attachBaseContext(Native Method)
I/dalvikvm: at com.storm.fengyue.StubApplication.attachBaseContext(StubApplication.java:105)
I/dalvikvm: at android.app.Application.attach(Application.java:181)
I/dalvikvm: at android.app.Instrumentation.newApplication(Instrumentation.java:991)
I/dalvikvm: at android.app.Instrumentation.newApplication(Instrumentation.java:975)
I/dalvikvm: at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
I/dalvikvm: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4317)
I/dalvikvm: at android.app.ActivityThread.access$1500(ActivityThread.java:135)
I/dalvikvm: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
I/dalvikvm: at android.os.Handler.dispatchMessage(Handler.java:102)
I/dalvikvm: at android.os.Looper.loop(Looper.java:136)
I/dalvikvm: at android.app.ActivityThread.main(ActivityThread.java:5017)
I/dalvikvm: at java.lang.reflect.Method.invokeNative(Native Method)
I/dalvikvm: at java.lang.reflect.Method.invoke(Method.java:515)
I/dalvikvm: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
I/dalvikvm: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
I/dalvikvm: at dalvik.system.NativeStart.main(Native Method)
E/dalvikvm: VM aborting
Это не зависит от FindClass, другие функции выдают ту же ошибку (env-> GetFieldID или env-> SetFieldID).Пытался отобразить шестнадцатеричное значение env, оно похоже до и после проблемной строки.Проверено, что JNI подключен к текущему потоку.
Весь код в github