VFY:register1 v4 类型 2,需要 17

VFY: register1 v4 type 2, wanted 17

我有以下 Smali 代码:

.method private a(Landroid/content/Context;Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/String;I)V
.registers 33
move/16 v22, p5
move-object/16 v21, p4
move-object/16 v20, p3
move-object/16 v19, p2
move-object/16 v18, p1
move-object/16 v17, p0
check-cast v21, Ljava/lang/String;
check-cast v20, Ljava/lang/String;
check-cast v19, Landroid/os/Bundle;
check-cast v18, Landroid/content/Context;
check-cast v17, Lcom/clevertap/android/sdk/aa;
move-object/from16 v1, v18
move-object/from16 v2, v19
move-object/from16 v3, v20
move/from16 v4, v22
.line 476

...

invoke-static {v4}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

这被 Dalvik 验证者拒绝,原因如下:

VFY: register1 v4 type 2, wanted 17
VFY:  rejecting opcode 0x71 at 0x05f0
VFY:  rejected Lcom/clevertap/android/sdk/aa;.a (Landroid/content/Context;Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/String;I)V
Verifier rejected class Lcom/clevertap/android/sdk/aa;

类型 17 是整数,类型 2 表示未知类型。为什么验证者会丢失类型?

鉴于偏移量为 0x05f0invoke-static 指令出现在方法中非常靠后的位置。几乎可以肯定在方法的顶部和那里也使用 v4 寄存器之间有代码。

我建议使用 baksmali 的 --register-info 功能,它会为每条指令添加注释 before/after,其中包含有关寄存器类型的详细信息。您应该能够向后跟踪代码并找出 v4 类型的来源。