gpt4 book ai didi

java - 为什么这是一个无效的 smali 寄存器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:42 27 4
gpt4 key购买 nike

我注入(inject)了这段代码invoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V在反编译的应用程序中。

像这样:

.line 70
move-object/from16 v0, p0

iget-object v0, v0, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->sharedPreferencesNotificationsHelper:Lcom/bee7/sdk/common/util/SharedPreferencesNotificationsHelper;

move-object/from16 v21, v0

sget v22, Lcom/bee7/gamewall/BannerNotification;->NUMBER_OF_REWARD_BANNER_NOTIFICATIONS_LAYOUTS:I

invoke-virtual/range {v21 .. v22}, Lcom/bee7/sdk/common/util/SharedPreferencesNotificationsHelper;->getNextRewardNotificationLayout(I)I

.line 76
sget v21, Lcom/bee7/gamewall/R$layout;->gamewall_banner_notification_reward_0:I

move-object/from16 v0, p0

move/from16 v1, v21

invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V
invoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V

.line 77
const/16 v21, 0x1

move/from16 v0, v21

move-object/from16 v1, p0

iput v0, v1, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->numberOfOffersInBannerNotification:I

但是当我尝试使用 apktool 构建它时,我收到以下消息:

com.outfit7.talkingtomcandyrun\smali\com\bee7\gamewall\dialogs\BannerNotificationDialog.smali[179,106] Invalid register: v25. Must be between v0 and v15, inclusive.

引用这一行:invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V .

为什么我会收到这个错误?我什至没有看到寄存器 v25在代码中。

编辑:

我在其他一些应用程序中尝试过,发现错误总是将最高寄存器加 1。所以如果方法中的最高寄存器是v17它会说Invalid register: v18 .

最佳答案

如果您查看 invoke-static 的文档操作码,你会看到它使用 4 位来编码每个参数寄存器,这只允许它引用寄存器 0-15。

p0是参数寄存器,参数寄存器位于方法中“分配”的寄存器范围的末尾。

因此,如果该方法有 30 个寄存器(.registers 30),并且它有 5 个(非长/非 double )参数,那么该方法的参数将作为 v25-v29 传递。 pNN最后寄存器只是这个寄存器范围的别名。所以在这种情况下,p0v25 的别名. p1v26 的别名等

此外,在计算参数数量时,不要忘记包含隐式 this非静态方法的参数,它始终是第一个传递的参数。即 p0

在这种情况下,最好的办法是改用 invoke-static/range,它接受连续的寄存器范围,并可以直接引用这些更高的寄存器。

例如

invoke-static/range {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V`

另一种选择是使用 move-object交换 p0 中的值暂时使用较低的寄存器,然后再将其交换回来。当然,您需要找到或创建一个未使用的寄存器才能进行交换。

关于java - 为什么这是一个无效的 smali 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53207249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com