Dalvik验证程序:register1 v25类型0,需要引用

时间:2019-03-02 16:38:34

标签: android dalvik smali

我有以下Smali代码:

.method private k(I)V
.registers 27 (original) 29 (after)

...
#@68a
invoke-direct/range {v24 .. v25}, Landroid/widget/LinearLayout;-><init>(Landroid/content/Context;)V
...

这被Dalvik验证程序拒绝。 0x76是直接调用/范围。

dalvikvm: VFY: register1 v25 type 0, wanted ref
dalvikvm: VFY: bad arg 1 (into Landroid/content/Context;)
dalvikvm: VFY:  rejecting call to Landroid/widget/LinearLayout;.<init> (Landroid/content/Context;)V
dalvikvm: VFY:  rejecting opcode 0x76 at 0x068a
dalvikvm: VFY:  rejected Lcom/pocketwood/myav/MyAV;.k (I)V
dalvikvm: Verifier rejected class Lcom/pocketwood/myav/MyAV;
dalvikvm: Class init failed in newInstance call (Lcom/pocketwood/myav/MyAV;)

有趣的是,在68a以上的任何指令中均未使用v25!原始的APK运行正常,但是重新打包了smali,验证程序拒绝了MyAV类。

2 个答案:

答案 0 :(得分:1)

我怀疑您的代码位置错误。如果您查看错误消息,它会提到操作码0x76,即invoke-direct/range。您提供的代码段中没有invoke-direct/range指令,因此,除非确实发生了一些麻烦,否则不会成为导致问题的代码。

此外,请查看错误消息中的方法名称:Lcom/pocketwood/myav/MyAV;.k (I)V。 k之后看起来像是一个空格。空格字符本身不是方法名称中的有效字符,但实际上它可能是其他一些类似空格的Unicode字符?

没关系。该空间似乎被烘焙到error message中。


最后,错误消息(at 0x068a)中提到的偏移应为包含方法中指令的代码偏移。拆卸dex文件时,可以使用baksmali的--offsets选项,并且baksmali将在每条指令之前添加注释,其代码偏移量。虽然,我不确定偏移是否以字节或代码单位(16位)为单位,所以偏移量可能为2。

答案 1 :(得分:0)

解决方案是:v26为p1,v25为p0。由于修改,寄存器计数已扩展到29,并且由于v25不再为p0。