1

私はapkファイルをリバースエンジニアリングしていましたが、アラートダイアログがキャンセル可能であることがわかりましたfalse

invoke-virtual {v0, v4}, Landroid/app/AlertDialog$Builder;->setCancelable(Z)Landroid/app/AlertDialog$Builder;

(Java コードでは、cancelable false と表示されます)

だから私は他のアプリでこのコードを試してコンパイルしました

.setCancelable(true)

しかし、それはsmaliのコードラインは同じままです

invoke-virtual {v2, v3}, Landroid/app/AlertDialog$Builder;->setCancelable(Z)Landroid/app/AlertDialog$Builder;

では、smali ファイルで cancelable を true に変更するにはどうすればよいですか。

4

2 に答える 2

2

これを読んでください:http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

実行すると、定数プールが使用されていることがわかります。定数プールを編集し、定数プールに追加した値で新しい invokevirtual を作成する必要があります。

BCEL や ASM の私の通常の提案ではなく、おそらく全体に慣れていないので、JBE、http: //set.ee/jbe/ へのリンクを提供します。

于 2014-12-14T05:53:56.283 に答える
0

invoke-virtualオブジェクトの仮想メソッドを呼び出すJavaのコマンドのニーモコードです(かなり明白です)。実際の呼び出しを実行するために、1 つから多くの「パラメーター」 (または厳密に言えばレジスター) を使用します。最初のものは、呼び出すメソッドのオブジェクトへのポインターであり、残りはそのメソッドパラメーターの値を定義するために使用されます。最初の例v0v4は、レジスタへのポインタです(それらはローカル変数と考えることができます)。クラスv0のオブジェクトへのポインタも同様です。レジスタは setCancelable パラメータの値を保持しますandroid.app.AlertDialog.Builder。このコードから、またはv4を呼び出しているかどうかを判断することはできません。この部分のスマリコードは、両方で同じになります。メソッドのパラメーターの実際の値は、->setCancelable(True)->setCancelable(False)v4このコード行の前のどこかに登録してください。const/4 v4, 0x0したがって、おそらく上記の数行のようなものを見ることができます。Falseパラメータの値を定義します。それを 0x1 に変更すると、apktool-it を apk に戻す準備が整います。

考慮すべき読み物: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html https://code.google.com/p/smali/wiki/Registers

于 2014-12-22T19:06:20.410 に答える