打包交换机如何在Android上作为smalto由apktool生成?

时间:2013-09-02 01:33:01

标签: android smali

我正在尝试使用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有什么用?

1 个答案:

答案 0 :(得分:13)

正如您所注意到的,开关分为两部分。您列出的第二部分是有效负载伪指令,其中包含所有切换案例。第一部分是打包切换指令,它定义包含要检查的值的寄存器,并使用标签引用有效负载指令。

对于打包交换机,有效负载伪指令中的大小写值是顺序的,只有第一个值实际给出(在本例中为0x7f060395)

具体来说,当执行压缩开关指令时,它将根据有效负载中的3种情况检查v0寄存器的值。如果值为0x7f060395,则跳转到:pswitch_4,如果为0x7f060396,则跳转到:pswitch_5等。

如果寄存器的值与任何情况都不匹配,则执行将继续执行packed-switch指令之后的下一条指令(带有寄存器和标签的指令,而不是有效负载伪指令)

稀疏开关指令类似,只是它的有效负载指令具有与每种情况相关的显式值,而不是使用顺序键值。

您可以在dalvik-bytecode文档中找到所有细节。