android 4.4.2 VFY:无效的切换目标22( - > 0x18)在0x2 [0]

时间:2014-07-09 01:58:06

标签: android bytecode dalvik opcode

我在类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)

1 个答案:

答案 0 :(得分:1)

您的验证失败,因为您尝试转移到的地址不是指令。

自2011年中期以来,Dalvik运行时的变化很小,因此这不太可能是验证行为的变化。对“dx”进行了一些更改,因此可能会以不同的方式生成方法的字节码,并且您的代码注入器无法正常使用此输出。

要做的第一件事是获取DEX文件的反汇编(使用dexdump或smali),并查看指令偏移0x18处的内容。

FWIW,验证码为checkSwitchTargets()。您可以在kitkat sources中看到它,如果您希望在donut中找到历史记录dvmCheckSwitchTargets()