¿Por qué es esto un registro smali no válida?

dugof:

Inyecté esta pieza de código invoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)Ven 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 v25en 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 v17que va a decir Invalid register: v18.

JesusFreke:

Si nos fijamos en la documentación para el invoke-staticcó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 pNNregistros son sólo un alias para esta gama de registros al final. Así pues, en este caso, p0es un alias para v25. p1es un alias para v26, etc.

Además, al contar el número de argumentos, no se olvide de incluir la implícita thisargumento 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-objectpara cambiar el valor en p0un 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=181684&siteId=1
Recomendado
Clasificación