我有一个应用程序可以对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");
恰好要跳转到mem_loadDex_dvm函数中,此行之后会出现问题
openDexFile(args, &pResult);
错误文字:
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
中