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

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

解决方法

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

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

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

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

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

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

相关文章

文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win1...
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由main...
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件...
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项...
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上...
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供...