Inyecté esta pieza de código invoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V
en una aplicación decompiled.
Me gusta esto:
.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
Pero cuando he intentado construirlo con apktool i rechieve el siguiente mensaje:
com.outfit7.talkingtomcandyrun\smali\com\bee7\gamewall\dialogs\BannerNotificationDialog.smali[179,106] Invalid register: v25. Must be between v0 and v15, inclusive.
Con referencia a esta línea: invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V
.
¿Por qué recibo este error? Ni siquiera veo registro v25
en el código.
Editar:
Lo he probado con algunas otras aplicaciones y se dio cuenta de que el error siempre se suma 1 al registro más alto. Así que si el registro más alto del método es v17
que va a decir Invalid register: v18
.
Si nos fijamos en la documentación para el invoke-static
código de operación, verá que se utiliza 4 bits para codificar cada registro de parámetros, que sólo permite a los registros de referencia 0-15.
p0
es un registro de parámetros, y los registros de parámetros están en el extremo de la "asignado" rango de registro en el método.
Por lo tanto, si el método tiene, por ejemplo, 30 registros ( .registers 30
), y tiene 5 argumentos (no-tiempo / no dobles), a continuación, serán incluídos en los argumentos del método en tan V25-V29. Los pNN
registros son sólo un alias para esta gama de registros al final. Así pues, en este caso, p0
es un alias para v25
. p1
es un alias para v26
, etc.
Además, al contar el número de argumentos, no se olvide de incluir la implícita this
argumento a favor de métodos no estáticos, que es siempre primero el argumento pasado. es decirp0
En este caso, lo mejor es utilizar Invoke-estática / intervalo de cambio, el cual acepta un rango contiguo de registros, y se puede hacer referencia directamente a estos registros más altos.
por ejemplo,
invoke-static/range {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V`
Otra opción sería utilizar move-object
para cambiar el valor en p0
un registro inferior temporalmente, y luego pasar nuevamente después. Tendrá que encontrar o crear un registro no utilizada con el fin de hacer el canje, por supuesto.