Почему это неправильный регистр smali? - PullRequest
0 голосов
/ 08 ноября 2018

Я вставил этот кусок кода 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 в коде.

Edit:

Я пробовал это с некоторыми другими приложениями и заметил, что ошибка всегда добавляет 1 к старшему регистру. Таким образом, если самый высокий регистр в методе равен v17, он скажет Invalid register: v18.

1 Ответ

0 голосов
/ 08 ноября 2018

Если вы посмотрите документацию для кода операции invoke-static, вы увидите, что он использует 4 бита для кодирования каждого регистра параметра, что позволяет ему ссылаться только на регистры 0-15.

p0 является регистром параметров, а регистры параметров находятся в конце «выделенного» диапазона регистров в методе.

Итак, если метод имеет, скажем, 30 регистров (.registers 30), и онимеет 5 (non-long / non-double) аргументов, тогда аргументы метода будут переданы как v25-v29.Регистры pNN являются просто псевдонимом этого диапазона регистров в конце.Так что в этом случае p0 является псевдонимом для v25.p1 является псевдонимом для v26 и т. Д.

Кроме того, при подсчете количества аргументов не забудьте включить неявный аргумент this для нестатических методов, который всегдапервый пройденный аргумент.т. е. p0

В этом случае лучше всего вместо этого использовать invoke-static / range, который принимает непрерывный диапазон регистров и может напрямую ссылаться на эти более высокие регистры.

например

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

Другой вариант - использовать move-object, чтобы временно поменять значение в p0 с нижним регистром, а затем поменять его местами.Конечно, вам нужно будет найти или создать неиспользуемый регистр, чтобы выполнить обмен.

...