1

メソッド「send()」の次の呼び出しをsmaliメソッドに追加したい:

invoke-direct {p0}, X->send()V

send() は現在のクラスのメソッドです。X は、現在のクラス名のワイルドカードです。現在、未解決の問題が 2 つあります。

  1. なぜinvoke-directはレジスタp0を必要とするのですか? これはパラメーターだと思いました。

  2. p0 レジスタを考慮に入れる必要がありますか? この追加コードをそのままにしておくと、アプリ全体がコンパイルされなくなる可能性はありますか? もしそうなら、どのレジスタを使用する必要があるかをどのように見つけることができますか?

このメソッド呼び出しを任意のメソッドに追加したい。メソッドの構造がわからず、レジスタの使用法も予測できません。したがって、上位コードの p0 が変化する可能性があるかどうか、およびどのような条件下で変化するかを正確に知る必要があります。

私の意図を強調するために、簡単な例を示します。

スマートフォンに保存されている連絡先を読み取るだけのこのメソッドがあるとします。

.method private getContacts()Ljava/util/ArrayList;
.locals 12
.annotation system Ldalvik/annotation/Signature;
value = {
"()",
"Ljava/util/ArrayList",
"<",
"Ljava/lang/String;",
">;"
}
.end annotation
.prologue
const/4 v2, 0x0
.line 43
new-instance v7, Ljava/util/ArrayList;
invoke-direct {v7}, Ljava/util/ArrayList;-><init>()V
.line 44
.local v7, "contacts":Ljava/util/ArrayList;, "Ljava/util/ArrayList<Ljava/lang/String;>;"
invoke-virtual {p0}, Lorg/puellen/contacts/MainActivity;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v0
sget-object v1, Landroid/provider/ContactsContract$Contacts;->CONTENT_URI:Landroid/net/Uri;
move-object v3, v2
move-object v4, v2
move-object v5, v2
...

このコードを .apk ファイルから自動的に抽出するパーサーを作成しました。ここで、上位のメソッド呼び出しを追加して、メソッドの機能を拡張したいと考えています。

この場合、最初に呼び出しを追加するだけです。唯一の違いは 13 行目に表示されます (コメントを参照)

.method private getContacts()Ljava/util/ArrayList;
.locals 12
.annotation system Ldalvik/annotation/Signature;
value = {
"()",
"Ljava/util/ArrayList",
"<",
"Ljava/lang/String;",
">;"
}
.end annotation
.prologue
invoke-direct {p0}, Lorg/my_package/custom_class/MainActivity;->send()V # added method call
const/4 v2, 0x0
.line 43
new-instance v7, Ljava/util/ArrayList;
invoke-direct {v7}, Ljava/util/ArrayList;-><init>()V
.line 44
.local v7, "contacts":Ljava/util/ArrayList;, "Ljava/util/ArrayList<Ljava/lang/String;>;"
invoke-virtual {p0}, Lorg/puellen/contacts/MainActivity;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v0
sget-object v1, Landroid/provider/ContactsContract$Contacts;->CONTENT_URI:Landroid/net/Uri;
move-object v3, v2
move-object v4, v2
move-object v5, v2

.prologueの後にメソッド呼び出しを追加するだけです。しかし、この動作が常に機能するとは限りません。通話を追加する「完璧な」場所はありますか? 「invoke-direct」で常にp0を使用できますか、または使用できるレジスタを確認するにはどうすればよいですか?


質問: "invoke-direct" で常にp0を使用できますか、または使用できるレジスタを確認するにはどうすればよいですか?

回答: 「非静的メソッドの最初のパラメーターは、常にメソッドが呼び出されるオブジェクトです。」(リンクは最初のコメントのブローを参照)。私のメソッドは静的ではないため、常に p0 を使用できます

これで、メソッド呼び出しを配置する場所を知る必要があるだけです。

4

0 に答える 0