我试图找到一种方法来重写在数组初始化中使用的立即数。重写ARRAY_PAYLOAD指令
例如,该Java代码:
package my;
public class Test {
public static final int[] SomeArray = { 10, 20, 30 };
}
产生以下smali(省略不相关部分):
# 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
我想改变立即值为100,200,300 (适当地)。
array-data
元素具有ARRAY_PAYLOAD
操作码,并在smali中表示为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)接口。 –
虽然,我仍然有兴趣看看是否有另一种(也许更优雅)的方式来做到这一点。 –