배열 초기화에 사용 된 바로 가기를 다시 쓰는 방법을 찾으려고합니다. 예를 들어ARRAY_PAYLOAD 명령 다시 쓰기
이 자바 코드 :
# 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
opcode를 가지며 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) 인터페이스. –
그러나, 나는 아직도 그것을 할 다른 (아마도,보다 우아한) 방법이 있는지보고 싶다. –