重写 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 的一个实例。 ReferenceInstruction
的 Instruction rewriter filters instances,并且由于 DexBackedArrayPayload
不是 ReferenceInstruction
的实例 - 没有开箱即用的支持。
我想创建(和 return)DexBackedArrayPayload
的新实例,但正如其名称所描述的那样——为了检索它直接从 dex 文件读取的数组元素。
还有其他解决方法吗?
是的,您正在查看的重写内容的总体思路是,为您感兴趣的内容提供自己的子类,并重写重写方法来执行.. 无论您是什么想做。
在这种情况下,听起来您想要创建并 return 一个具有您自己的数字常量的新 ImmutableArrayDataPayload。
我正在尝试找到一种方法来重写数组初始化中使用的立即数。
例如,这个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 的一个实例。 ReferenceInstruction
的 Instruction rewriter filters instances,并且由于 DexBackedArrayPayload
不是 ReferenceInstruction
的实例 - 没有开箱即用的支持。
我想创建(和 return)DexBackedArrayPayload
的新实例,但正如其名称所描述的那样——为了检索它直接从 dex 文件读取的数组元素。
还有其他解决方法吗?
是的,您正在查看的重写内容的总体思路是,为您感兴趣的内容提供自己的子类,并重写重写方法来执行.. 无论您是什么想做。
在这种情况下,听起来您想要创建并 return 一个具有您自己的数字常量的新 ImmutableArrayDataPayload。