google / smali

Other
183 stars 30 forks source link

DexRewriter produces invalid files #63

Open weary-adventurer opened 2 weeks ago

weary-adventurer commented 2 weeks ago

Compile and run sample program that uses DexRewriter without any passes:

import com.android.tools.smali.dexlib2.DexFileFactory;
import com.android.tools.smali.dexlib2.dexbacked.DexBackedDexFile;
import com.android.tools.smali.dexlib2.iface.DexFile;
import com.android.tools.smali.dexlib2.rewriter.DexRewriter;
import com.android.tools.smali.dexlib2.rewriter.RewriterModule;

public class Main {
    public static void main(String[] args) {
        try {
            DexBackedDexFile dexFile = DexFileFactory.loadDexFile("classes_original.dex", null);
            DexRewriter rewriter = new DexRewriter(new RewriterModule());
            DexFile newDexFile = rewriter.getDexFileRewriter().rewrite(dexFile);
            DexFileFactory.writeDexFile("classes_rewritten.dex", newDexFile);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Using smali library 3.0.7:

$ ls lib
smali-3.0.7.jar  smali-baksmali-3.0.7.jar  smali-dexlib2-3.0.7.jar  smali-util-3.0.7.jar guava-33.2.1-jre.jar  jcommander-1.64.jar 

Try to disassemble classes_original.dex (success):

$ java -cp "lib\*" com.android.tools.smali.baksmali.Main dis -o classes_original_out classes_original.dex

Try to disassemble classes_rewritten.dex (failure):

$ java -cp "lib\*" com.android.tools.smali.baksmali.Main dis -o classes_rewritten_out classes_rewritten.dex

Error occurred while disassembling class LFC0; - skipping class
com.android.tools.smali.util.ExceptionWithContext: Invalid uleb128 integer encountered at offset 0x110642
        at com.android.tools.smali.dexlib2.dexbacked.DexReader.readUleb128(DexReader.java:147)
        at com.android.tools.smali.dexlib2.dexbacked.DexReader.readSmallUleb128(DexReader.java:118)
        ...
Error occurred while disassembling class LVL1; - skipping class
com.android.tools.smali.util.ExceptionWithContext: Invalid string index 1237382, not in [0, 19974)
        at com.android.tools.smali.util.ExceptionWithContext.withContext(ExceptionWithContext.java:54)
        at com.android.tools.smali.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:168)
        ...
Error occurred while disassembling class Landroidx.appcompat.widget.AppCompatTextView; - skipping class
com.android.tools.smali.util.ExceptionWithContext: Invalid string index 157401990, not in [0, 19974)
        at com.android.tools.smali.util.ExceptionWithContext.withContext(ExceptionWithContext.java:54)
        at com.android.tools.smali.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:168)
        ...

Download: classes_original.dex