重写 ARRAY_PAYLOAD 指令

Rewriting ARRAY_PAYLOAD instruction

我正在尝试找到一种方法来重写数组初始化中使用的立即数。

例如,这个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 class 的一个实例。 ReferenceInstructionInstruction rewriter filters instances,并且由于 DexBackedArrayPayload 不是 ReferenceInstruction 的实例 - 没有开箱即用的支持。

我想创建(和 return)DexBackedArrayPayload 的新实例,但正如其名称所描述的那样——为了检索它直接从 dex 文件读取的数组元素。

还有其他解决方法吗?

是的,您正在查看的重写内容的总体思路是,为您感兴趣的内容提供自己的子类,并重写重写方法来执行.. 无论您是什么想做。

在这种情况下,听起来您想要创建并 return 一个具有您自己的数字常量的新 ImmutableArrayDataPayload。