2017-04-20 80 views
0

我試圖找到一種方法來重寫在數組初始化中使用的立即數。重寫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 instancesReferenceInstruction,並且因爲DexBackedArrayPayload不是ReferenceInstruction的實例 - 所以沒有開箱即用的支持。

我以爲創建(並返回)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與你自己的數字常量。