Env перестал работать правильно после вызова функции openDexFile в случае JNI - PullRequest
0 голосов
/ 19 июня 2019

У меня есть приложение, которое шифрует файл 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...