我在类dex中插入新的字节码。 字节码是打包开关(x2bx00xFFxFFxFFxFF)。
我是成功代码注入。
在4.3版本下运行良好。 但它没有工作4.4.2
这是堆栈跟踪。
07-08 20:54:54.504: W/dalvikvm(1165): VFY: invalid switch target 22 (-> 0x18) at 0x2[0]
07-08 20:54:54.504: W/dalvikvm(1165): VFY: rejecting opcode 0x2b at 0x0002
07-08 20:54:54.504: W/dalvikvm(1165): VFY: rejected Lcom/example/hello_test/MainActivity;.<init> ()V
07-08 20:54:54.504: W/dalvikvm(1165): Verifier rejected class Lcom/example/hello_test/MainActivity;
07-08 20:54:54.504: W/dalvikvm(1165): Class init failed in newInstance call (Lcom/example/hello_test/MainActivity;)
07-08 20:54:54.504: D/AndroidRuntime(1165): Shutting down VM
07-08 20:54:54.514: W/dalvikvm(1165): threadid=1: thread exiting with uncaught exception (group=0xb2aacba8)
07-08 20:54:54.514: E/AndroidRuntime(1165): FATAL EXCEPTION: main
07-08 20:54:54.514: E/AndroidRuntime(1165): Process: com.example.hello_test, PID: 1165
07-08 20:54:54.514: E/AndroidRuntime(1165): java.lang.VerifyError: com/example/hello_test/MainActivity
07-08 20:54:54.514: E/AndroidRuntime(1165): at java.lang.Class.newInstanceImpl(Native Method)
07-08 20:54:54.514: E/AndroidRuntime(1165): at java.lang.Class.newInstance(Class.java:1208)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.app.ActivityThread.access$800(ActivityThread.java:135)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.os.Handler.dispatchMessage(Handler.java:102)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.os.Looper.loop(Looper.java:136)
07-08 20:54:54.514: E/AndroidRuntime(1165): at android.app.ActivityThread.main(ActivityThread.java:5017)
07-08 20:54:54.514: E/AndroidRuntime(1165): at java.lang.reflect.Method.invokeNative(Native Method)
07-08 20:54:54.514: E/AndroidRuntime(1165): at java.lang.reflect.Method.invoke(Method.java:515)
07-08 20:54:54.514: E/AndroidRuntime(1165): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-08 20:54:54.514: E/AndroidRuntime(1165): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-08 20:54:54.514: E/AndroidRuntime(1165): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
您的验证失败,因为您尝试转移到的地址不是指令。
自2011年中期以来,Dalvik运行时的变化很小,因此这不太可能是验证行为的变化。对“dx”进行了一些更改,因此可能会以不同的方式生成方法的字节码,并且您的代码注入器无法正常使用此输出。
要做的第一件事是获取DEX文件的反汇编(使用dexdump或smali),并查看指令偏移0x18处的内容。
FWIW,验证码为checkSwitchTargets()
。您可以在kitkat sources中看到它,如果您希望在donut中找到历史记录dvmCheckSwitchTargets()
。