JesusFreke/smali

MEthod is trucated

Closed this issue · 6 comments

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

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.

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?

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.

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

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

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