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



我在一个反编译的应用程序中注入了这段代码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.talkingtomcandyrunsmalicombee7gamewalldialogsBannerNotificationDialog.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个(非长/非双(参数,那么该方法的参数将作为v25-v29传入。pNN寄存器只是该寄存器范围末尾的一个别名。因此,在这种情况下,p0v25的别名。p1v26等的别名。

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

在这种情况下,最好使用invoke-static/rerange,它接受一个连续的寄存器范围,并且可以直接引用这些更高的寄存器。

例如

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

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

最新更新