2017-04-20 3 views
0

배열 초기화에 사용 된 바로 가기를 다시 쓰는 방법을 찾으려고합니다. 예를 들어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 instancesReferenceInstruction이고 DexBackedArrayPayloadReferenceInstruction이 아니기 때문에 즉시 사용할 수 있습니다.

나는 DexBackedArrayPayload의 새 인스턴스를 생성하고 생각했지만 그 이름에서 알 수 있듯이 배열 요소를 검색하기 위해 dex 파일에서 직접 읽습니다.

다른 해결 방법이 있습니까?

+0

업데이트 : 내가 해결 방법을 찾을 - 대신 DexBackedArrayPayload', 내가 [ArrayPayload] 구현하는 익명 클래스의 인스턴스 (https://github.com/JesusFreke/smali/blob/76d69c7466b74b79e492d0edc6ff619adaeb78a1/dexlib2를 반환하고있어'반환하는 /src/main/java/org/jf/dexlib2/iface/instruction/formats/ArrayPayload.java) 인터페이스. –

+0

그러나, 나는 아직도 그것을 할 다른 (아마도,보다 우아한) 방법이 있는지보고 싶다. –

답변

1

오른쪽에서 볼 때 재 작성 내용에 대한 일반적인 개념은 관심있는 것에 대한 하위 클래스를 제공하고 다시 작성할 방법을 재정의하는 것입니다. 무엇을 원 하든지간에 할 것.

이 경우 사용자가 직접 만든 숫자 상수를 사용하여 새로운 ImmutableArrayDataPayload를 만들고 반환하려는 것처럼 들립니다.