i反向Android应用程序。在阅读时,我看到了一些使用p1
或p2
等变量的方法...我不知道在哪里可以参考这些变量。例如:
.method public b(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
.locals 1
invoke-static {}, Lpnf/this/object/does/not/Exist;->a()Z
move-result v0
invoke-static {v0}, Lpnf/this/object/does/not/Exist;->b(I)V
.prologue
.line 33
if-eqz p1, :cond_0
if-eqz p2, :cond_0
if-eqz p3, :cond_0
.line 34
invoke-static {p1, p2, p3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
.line 36
:cond_0
return-void
.end method
我不明白的是:
if-eqz p1, :cond_0
if-eqz p2, :cond_0
if-eqz p3, :cond_0
我不知道变量p1
p2
p3
在这里。请告诉我。谢谢
p1,p2等只是汇编程序提供的句法糖。在DEX代码中,本地变量和参数是一个巨大的数组,并且在数组的最后几个插槽中传递了参数。汇编器可以帮助您直接通过PN语法参考参数,而不必跟踪您拥有的本地变量并使用适当的VN。
在发布的示例中,您有1个本地变量和4个参数,这意味着寄存器看起来像{v0, p0, p1, p2, p3}
。
后面的4在方法开始时自动初始初始初始初始初始化。