1

私はsmaliの使用にかなり精通しているので、これが初心者の質問である場合は申し訳ありません.

コードにロギング呼び出しを挿入することを目的として、Apktool を使用して apk ファイルを smali に変換しています。

これを行うために、(新しいレジスタを追加するために) .locals を 1 つ増やしてから、すべてのレジスタを元の位置に戻そうとしています。

2 つのレジスター (long と double) を使用するパラメーターを移動しようとすると問題が発生します。それらを移動するコードを含めると、apk は再コンパイルされますが、エミュレーターで開きません。他のタイプを移動する場合、この問題は発生しません。

たとえば、以下は正常に動作します。68 行目に追加するmove-wide/from16 v6, p1と、アプリが開かなくなります (以下は、.locals を 5 からインクリメントした後です)。

.method public breakerTheSecond(JLjava/lang/String;)V
 59      .locals 6
 60      .param p1, "pk"    # J
 61      .param p3, "ab"    # Ljava/lang/String;
 62 
 63      .prologue
 64       move-object/from16 v8, p3
 65 
 66      move-object/from16 v5, p0
 67 
 68      
 69 
 70     .line 56
 71      const/4 v0, 0x1
 72 
 73      .local v0, "a":I
 74      const/4 v1, 0x2
 75 
 76      .line 58
 77      .local v1, "b":I
 78      invoke-virtual {v5}, Lcom/test/bbutton  
   /MyActivity;->getApplicationContext()Landroid/content/Context;
 79 
 80      move-result-object v2
 81 
 82      const-string v3, "test"
 83 
 84      const/4 v4, 0x0
 85 
 86      invoke-static {v2, v3, v4}, Landroid/widget    
      /Toast;->makeText(Landroid/content/Context;Ljava
    /lang/CharSequence;I)Landroid/widg    et/Toast;
 87 
 88      move-result-object v2
 89 
 90      .line 59
 91      invoke-virtual {v2}, Landroid/widget/Toast;->show()V
 92 
 93      .line 61
 94      return-void
 95  .end method

助けてくれてありがとう!

4

1 に答える 1

0

long 値と double 値は、最初のレジスタのみを使用して参照されます。したがって、move-object/from16 v5, p066 行目で実行すると、double 値全体が p0、p1 から v5、v6 に移動します。

64ビット値の後半を参照することは許可されていないため、実行しようとするとmove-wide/from16 v6, p1、p1がp0の値の後半であることがわかり、不機嫌になります:)

于 2015-08-05T21:03:55.197 に答える