【问题标题】:How does packed-switch work on Android as smali produced by apktool?作为 apktool 生成的 smali,packed-switch 如何在 Android 上工作?
【发布时间】:2013-09-02 01:33:01
【问题描述】:

我正在尝试使用 apktool d 对 apk 进行逆向工程,它生成的 smali 包含我不完全理解的打包开关语句。一个方法包含:

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 有什么关系?

【问题讨论】:

    标签: android smali


    【解决方案1】:

    如您所见,开关分为两部分。您列出的第二部分是有效负载伪指令,其中包含所有开关情况。第一部分是打包开关指令,它定义了包含要检查的值的寄存器,并使用标签引用有效负载指令。

    对于packed-switch,payload伪指令中的case值是连续的,实际上只给出了第一个值(本例中为0x7f060395)

    具体而言,对于您的示例,当执行打包切换指令时,它将根据有效负载中的 3 种情况检查 v0 寄存器的值。如果值为0x7f060395,则跳转到:pswitch_4,如果值为0x7f060396,则跳转到:pswitch_5等

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

    sparse-switch 指令类似,只是它的有效载荷指令具有与每个案例相关的显式值,而不是使用顺序键值。

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

    【讨论】:

    • 谢谢,这说明了一切。
    • 我希望你不介意,我在forum.xda-developers.com 上复制了你的答案,因为我在那里问了同样的问题。如果这冒犯了你,请告诉我,我会删除它。
    • 不用担心 :)。有趣的是,我现在通过你在 xda 上发帖。 (我曾经是 g1 时代的常客)。
    • 我假设它不匹配,然后继续执行?
    • 哦,是的,你做到了,哎呀 :)
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2021-04-01
    • 1970-01-01
    • 2012-11-23
    • 2012-03-13
    相关资源
    最近更新 更多