JesusFreke / smali

smali/baksmali
6.29k stars 1.07k forks source link

MEthod is trucated #824

Closed 3ntr0phy closed 2 years ago

3ntr0phy commented 3 years ago

I am using the latest version of baksmali -2.5.2 - and I get the following error

java -jar baksmali-2.5.2.jar disassemble ./app/classes.dex 

Error occurred while disassembling class La.bi; - skipping class
org.jf.util.ExceptionWithContext: The last instruction in method La/bi;->b()I is truncated
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:99)
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:87)
    at org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator.computeNext(VariableSizeLookaheadIterator.java:60)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:257)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:217)
    at org.jf.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:86)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeVirtualMethods(ClassDefinition.java:324)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:115)
    at org.jf.baksmali.Baksmali.disassembleClass(Baksmali.java:161)
    at org.jf.baksmali.Baksmali.access$000(Baksmali.java:46)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:76)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:74)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Error while processing method La/bi;->b()I

Error occurred while disassembling class Landroid.a; - skipping class
org.jf.util.ExceptionWithContext: The last instruction in method Landroid/a;->a()Ljava/lang/String; is truncated
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:99)
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:87)
    at org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator.computeNext(VariableSizeLookaheadIterator.java:60)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:257)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:217)
    at org.jf.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:86)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeVirtualMethods(ClassDefinition.java:324)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:115)
    at org.jf.baksmali.Baksmali.disassembleClass(Baksmali.java:161)
    at org.jf.baksmali.Baksmali.access$000(Baksmali.java:46)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:76)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:74)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Error while processing method Landroid/a;->a()Ljava/lang/String;

Error occurred while disassembling class Landroid.support.v4.a; - skipping class
org.jf.util.ExceptionWithContext: The last instruction in method Landroid/support/v4/a;->a()Ljava/lang/String; is truncated
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:99)
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:87)
    at org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator.computeNext(VariableSizeLookaheadIterator.java:60)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:257)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:217)
    at org.jf.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:86)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeVirtualMethods(ClassDefinition.java:324)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:115)
    at org.jf.baksmali.Baksmali.disassembleClass(Baksmali.java:161)
    at org.jf.baksmali.Baksmali.access$000(Baksmali.java:46)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:76)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:74)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Error while processing method Landroid/support/v4/a;->a()Ljava/lang/String;

Error occurred while disassembling class Landroid.support.a; - skipping class
org.jf.util.ExceptionWithContext: The last instruction in method Landroid/support/a;->a()Ljava/lang/String; is truncated
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:99)
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:87)
    at org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator.computeNext(VariableSizeLookaheadIterator.java:60)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:257)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:217)
    at org.jf.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:86)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeVirtualMethods(ClassDefinition.java:324)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:115)
    at org.jf.baksmali.Baksmali.disassembleClass(Baksmali.java:161)
    at org.jf.baksmali.Baksmali.access$000(Baksmali.java:46)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:76)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:74)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Error while processing method Landroid/support/a;->a()Ljava/lang/String;

Error occurred while disassembling class Landroid.support.v4.app.aq; - skipping class
org.jf.util.ExceptionWithContext: The last instruction in method Landroid/support/v4/app/aq;->a()Ljava/lang/String; is truncated
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:99)
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:87)
    at org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator.computeNext(VariableSizeLookaheadIterator.java:60)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
    at com.google.common.collect.ImmutableCollection$Builder.addAll(ImmutableCollection.java:423)
    at com.google.common.collect.ImmutableList$Builder.addAll(ImmutableList.java:777)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:260)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:217)
    at org.jf.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:86)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeVirtualMethods(ClassDefinition.java:324)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:115)
    at org.jf.baksmali.Baksmali.disassembleClass(Baksmali.java:161)
    at org.jf.baksmali.Baksmali.access$000(Baksmali.java:46)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:76)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:74)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Error while processing method Landroid/support/v4/app/aq;->a()Ljava/lang/String;

Error occurred while disassembling class Landroid.support.v4.c.n; - skipping class
org.jf.util.ExceptionWithContext: The last instruction in method Landroid/support/v4/c/n;->a()Ljava/lang/String; is truncated
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:99)
    at org.jf.dexlib2.dexbacked.DexBackedMethodImplementation$1$1.readNextItem(DexBackedMethodImplementation.java:87)
    at org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator.computeNext(VariableSizeLookaheadIterator.java:60)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:257)
    at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:217)
    at org.jf.baksmali.Adaptors.MethodDefinition.<init>(MethodDefinition.java:86)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeVirtualMethods(ClassDefinition.java:324)
    at org.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:115)
    at org.jf.baksmali.Baksmali.disassembleClass(Baksmali.java:161)
    at org.jf.baksmali.Baksmali.access$000(Baksmali.java:46)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:76)
    at org.jf.baksmali.Baksmali$1.call(Baksmali.java:74)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Error while processing method Landroid/support/v4/c/n;->a()Ljava/lang/String;

8FEE61DFDA62A5734D0221D90CE1A1F894ECAA3F8D6C45A7F252514A1E173059.zip

JesusFreke commented 2 years ago

These are likely "fake" methods/classes added as a form of disassembly prevention. They are invalid methods that art rejects, but without rejecting the whole dex file. The valid classes should still be disassembled, and you should be able to ignore the errors related to these invalid classes.

Lanchon commented 2 years ago

hi JF. is there a way to force smali into creating such fake items? if they are just left out: i assume code could try to load a class and if not found or is loadable, tempering detection is triggered. anything can be done?

JesusFreke commented 2 years ago

There are a bajillion ways a class could be invalid. I don't have any interest in trying to represent all the different ways a class could be invalid in smali's syntax, so that invalid classes can be kept during a disassemble/assemble roundtrip.

Lanchon commented 2 years ago

but maybe the number of ways that running code can find out is reduced to a few execptions (depending on how much extra info the exceptions contain).

so eg, methods that should fail to verify could all be replaced with a single method implementation, and just an attribute in smali, no code.

anyway, just saying

JesusFreke commented 2 years ago

From a runtime perspective, the invalid class doesn't exist in either case. Any reference to it will fail to resolve.

Lanchon commented 2 years ago

ok, thanks. i thought malformed classes would trigger lazy exceptions only at load time, as the JVM does.