在JNI情况下调用openDexFile函数后,环境停止正常工作

时间:2019-06-19 14:57:14

标签: java android c++ java-native-interface

我有一个应用程序可以对android应用程序中的classes.dex文件进行加密以提供反向保护。解密后,classes.dex从内存中动态加载,但是我遇到了Android 4.4 KitKat(API级别19)的麻烦。在模拟器(Android Studio的AVD)上启动加密的apk后,它会崩溃。

问题在这段代码中:

jint mCookie = mem_loadDex_dvm(env, (char *)szDexPath);
// error appears in line below
jclass DexFileClass = env->FindClass("dalvik/system/DexFile");

line in github

恰好要跳转到mem_loadDex_dvm函数中,此行之后会出现问题

openDexFile(args, &pResult);

line in 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

0 个答案:

没有答案