我正在尝试使用apktool d
对apk进行反向工程,并且它产生的smali包含我不太了解的packed-switch语句。一个方法包含:packed-switch v0, :pswitch_data_0
在代码的后面带有:pswitch_X
之类的标签,其中X是数字,并在方法末尾带有:
:pswitch_data_0
.packed-switch 0x7f060395
:pswitch_4
:pswitch_5
:pswitch_1
.end packed-switch
这到底是做什么的?它看起来像是要跳转到的地方的列表,但是在什么条件下? 0x7f060395有什么作用?
最佳答案
正如您所注意到的,开关分为两部分。您列出的第二部分是有效负载伪指令,其中包含所有切换情况。第一部分是打包交换指令,它定义了包含要检查的值的寄存器,并使用标签引用了有效负载指令。
对于打包交换机,有效负载伪指令中的case值是顺序的,并且实际上仅给出第一个值(在这种情况下为0x7f060395)
具体来说,在您的示例中,当执行packed-switch指令时,它将针对有效负载中的3种情况检查v0寄存器的值。如果值为0x7f060395,则将跳至:pswitch_4,如果值为0x7f060396,则将跳至:pswitch_5,依此类推。
如果寄存器的值与任何一种情况都不匹配,则将从打包切换指令之后的下一条指令(带有寄存器和标签的指令,而不是有效负载伪指令)继续执行。
稀疏切换指令与之相似,不同之处在于其有效负载指令具有与每种情况关联的显式值,而不是使用顺序键值。
您可以在dalvik-bytecode文档中找到所有细节。
关于android - 作为apktool产生的smali,packed-switch如何在Android上运作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18564592/