【发布时间】:2014-04-04 02:11:20
【问题描述】:
每个人。我在 Dalvik 字节码上遇到了一个问题。
原始字节码是:
virtual methods
.method public onClick(Landroid/view/View;)V
.locals 12
.param p1, "v" # Landroid/view/View;
...
return-void
.end method
要打印一些东西,我需要添加 4 个新寄存器。但是 12(local)+2(arguments)+4(new)>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。有人可以帮我吗?谢谢。
【问题讨论】: