dalvik验证者:register1 v25类型0,想要参考



我有以下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;)

有趣的V25在68a以上的任何指令中均未使用!原始APK运行良好,但重新包装Smali验证者拒绝类Myav。

我怀疑您的代码位置错误。如果您查看错误消息,它将提到OpCode 0x76,即invoke-direct/range。您提供的代码片段没有invoke-direct/range指令,因此,除非确实发生了一些棘手的事情,否则这不是引起问题的代码。

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

没关系。该空间似乎被烘烤到错误消息中。


最后,错误消息(at 0x068a)中提到的偏移应为包含方法中指令的代码偏移。拆卸DEX文件时,您可以使用Baksmali的--offsets选项,而Baksmali将在每次指令之前添加对代码偏移的注释。虽然,我不确定偏移是否在字节或代码单元中,为16位,因此可能会偏离2倍。

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

最新更新