在Dalvik字节码上添加新寄存器

时间:2014-04-04 02:11:21

标签: android instrumentation

大家。我在Dalvik字节码的仪器上遇到了问题。

原始字节码是:

virtual methods

.method public onClick(Landroid/view/View;)V

    .locals 12

    .param p1, "v"    # Landroid/view/View;

...

    return-void

.end method

要打印一些东西,我需要添加4个新寄存器。但是,12(本地)+2(参数)+4(新)> 16,这将导致某些指令出现问题。

所以,我想到了一个引人注目的想法:

整个寄存器的数量是20. v0-v11是本地的,v18-v19是参数。

首先将v18-v19移动到v12-v13,参数寄存器在v15内。另外,

我们需要将p0修改为v12,将p1修改为v13。

如果我们想使用4个新寄存器,请将v0-v3移至v14-17。处理完4个新寄存器后,将v14-v17移回v0-v3。

新字节码变为:

virtual methods

.method public onClick(Landroid/view/View;)V

    .locals 18

    .param p1, "v"    # Landroid/view/View;

move v12, v18

move v13, v19

...

//want to use 4 new registers

move v14, v0

move v15, v1

move v16, v2

move v17, v3

//use 4 new registers

move v0, v14

move v1, v15

move v2, v16

move v3, v17

    return-void

.end method

不幸的是,我遇到了Java.lang.VerifyError。谁能帮助我?谢谢。

1 个答案:

答案 0 :(得分:1)

登记册不可互换。有些指令只接受寄存器0-15,其他指令0-255,所以这种方法不起作用。