私は配列の初期化で使用されているイミディエートを書き直す方法を見つけようとしています。例えばARRAY_PAYLOAD命令の書き換え
、このJavaコード:
# direct methods
.method static constructor <clinit>()V
.locals 1
.prologue
.line 4
const/4 v0, 0x3
new-array v0, v0, [I
fill-array-data v0, :array_0
sput-object v0, Lmy/Test;->SomeArray:[I
return-void
nop
:array_0
.array-data 4
0xa
0x14
0x1e
.end array-data
.end method
I 100に即時の値を変更したい、200、300:
package my;
public class Test {
public static final int[] SomeArray = { 10, 20, 30 };
}
は以下smali(省略無関係な部分)を生成します(適切に)。
array-data
要素は、ARRAY_PAYLOAD
オペコードを持ち、DexBackedArrayPayload
クラスのインスタンスとして表現されます。 Instruction rewriter filters instancesがReferenceInstruction
で、DexBackedArrayPayload
がReferenceInstruction
のインスタンスではないため、すぐに使用できるサポートはありません。
私はDexBackedArrayPayload
の新しいインスタンスを作成(返す)と考えましたが、その名前が示すように、配列要素を取得するためには、dexファイルから直接読み取ります。
その他の回避策はありますか?
更新:回避策を見つけました.DexBackedArrayPayloadを返す代わりに、[ArrayPayload](https://github.com/JesusFreke/smali/blob/76d69c7466b74b79e492d0edc6ff619adaeb78a1/dexlib2)を実装する匿名クラスのインスタンスを返します。 /src/main/java/org/jf/dexlib2/iface/instruction/formats/ArrayPayload.java)インターフェイス。 –
しかし、私はまだそれを行う別の(おそらく、よりエレガントな)方法があるかどうか見ることに興味があります。 –