Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dalvik验证程序:寄存器1 v25类型0,需要引用_Android_Dalvik_Smali - Fatal编程技术网

Android Dalvik验证程序:寄存器1 v25类型0,需要引用

Android Dalvik验证程序:寄存器1 v25类型0,需要引用,android,dalvik,smali,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 ... .method private k(I)V .登记册27(原件)29(之后) ... #@68a 调用dir

我有以下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
...
.method private k(I)V
.登记册27(原件)29(之后)
...
#@68a
调用direct/range{v24..v25},Landroid/widget/LinearLayout;->(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;)
dalvikvm:VFY:register1 v25类型0,需要引用
dalvikvm:VFY:bad arg 1(进入Landroid/content/Context;)
dalvikvm:VFY:拒绝调用Landroid/widget/LinearLayout;。(Landroid/content/Context;)V
dalvikvm:VFY:拒绝0x068a处的操作码0x76
dalvikvm:VFY:拒绝Lcom/pocketwood/myav/myav;。k(I)V
dalvikvm:验证人拒绝Lcom/pocketwood/myav/myav类;
dalvikvm:类初始化在newInstance调用中失败(Lcom/pocketwood/myav/myav;)

有趣的是,v25不用于68a以上的任何指令!原始的APK运行正常,但使用smali重新打包,验证器拒绝类MyAV。

我怀疑您的代码位置错误。如果查看错误消息,它会提到操作码0x76,即
invoke direct/range
。您提供的代码段没有
invoke direct/range
指令,因此,除非发生了一些非常不正常的事情,否则这不可能是导致问题的代码

另外,查看错误消息中的方法名称:
Lcom/pocketwood/myav/myav;。k(I)V
。在k后面有一个看起来像空格的东西。空格字符本身不是方法名称中的有效字符,但它实际上可能是其他一些空格,比如unicode字符

别客气。这个空间看起来像是被烤成了面包



最后,错误消息中提到的偏移量(
在0x068a
)应该是包含方法中指令的代码偏移量。在反汇编dex文件时,可以使用baksmali的
--offset
选项,baksmali将在每条指令之前添加带有代码偏移量的注释。尽管如此,我不确定偏移量是否以字节或代码单位表示,即16位,因此它可能会被关闭2倍。

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

您是对的,偏移量是错误的--这是一个很大的帮助!我更新了我原来的问题。听起来你在使用--parameter registers=false。如果保持打开状态,寄存器将被反汇编为p0,并且更改方法中的寄存器数量不会影响它。