If you are looking for the decompiler itself, visit https://github.com/jindrapetrik/jpexs-decompiler
NEW : We have got a new blog where we post some interesting SWF internals info.

#942 AS3 Deobfsucation - Stack owerflow exception in visitCode
Author:
honfika

Date created:
Type: bug
Visibility: Everybody
Assigned to:
Labels: AS3DecompilationDeobfuscation
State: closed 

> What steps will reproduce the problem?
Open 71C0000 - 13.swf
Find the method which is in the exception message.
> What is the expected output? What do you see instead?
Exception
Jul 05, 2015 7:21:58 AM com.jpexs.decompiler.flash.abc.types.MethodBody convert
SEVERE: Decompilation error in §_-KG§/§_-61p§.initializer
java.util.concurrent.ExecutionException: java.lang.StackOverflowError
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.jpexs.helpers.CancellableWorker.get(CancellableWorker.java:99)
at com.jpexs.helpers.CancellableWorker.call(CancellableWorker.java:117)
at com.jpexs.decompiler.flash.abc.types.MethodBody.convert(MethodBody.java:271)
at com.jpexs.decompiler.flash.abc.types.traits.TraitClass.convert(TraitClass.java:551)
at com.jpexs.decompiler.flash.abc.types.traits.Trait.convertPackaged(Trait.java:171)
at com.jpexs.decompiler.flash.abc.ScriptPack.convert(ScriptPack.java:153)
at com.jpexs.decompiler.flash.abc.ScriptPack$1.call(ScriptPack.java:187)
at com.jpexs.decompiler.flash.abc.ScriptPack$1.call(ScriptPack.java:184)
at com.jpexs.helpers.CancellableWorker$3.doInBackground(CancellableWorker.java:112)
at com.jpexs.helpers.CancellableWorker$1.call(CancellableWorker.java:49)
at java.util.concurrent.FutureTask.run(Unknown Source)
at com.jpexs.helpers.CancellableWorker.run(CancellableWorker.java:66)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.StackOverflowError
at java.util.HashMap.put(Unknown Source)
at
com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorRegisters.visitCode(AVM2
DeobfuscatorRegisters.java:126)
at
com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorRegisters.visitCode(AVM2
DeobfuscatorRegisters.java:209)
at
com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorRegisters.visitCode(AVM2
DeobfuscatorRegisters.java:209)
+ 1000 more lines in visitCode
> What version of the product are you using? Is it "nighlty build"? Which operating system
do you have?
> Please provide any additional information below. If the problem is related to a SWF
file, attach it here, otherwise we can't help you.
This method is quite large (about 13000 instruction), but contains only about 1200 labels
(jump targets), i can't belive that they are called in 1 single chain.
In visitcode the IfType instuctions are recursively visited before visiting the
instructions in the current flow. Maybe it would be better to fisrt check the instuctions
in the current flow.
I mean:
ins1
ins2
ifxx label2
ins4
ins5
label2: ins6
ins7
Currently the order is: ins1, ins2, ifxx, (recursive call) ins6, ins7 (return), ins4.
ins5
In the suggested way: ins1, ins2, ifxx, ins4, ins5, ins6, ins7 (now check the "ifxx"
target, but it is already processed)
For this you need to collect the possible targets to a list. Or iterate 2 times on the
instuction list. First only mark the instuctions in the current flow only, do not jump
anywhere, 2nd time is the current implementation.
The StackoverFlow in visitCode should be fixed now.
The method still timeouts.
I think the problem here is that register deobfuscator works only when there is only one
assignment to the registers. In this code, the true/false registers are assigned again -
mostly in unreachable code... I'll try it to fix it...
State: new→returned
Current revision should handle it better :-).
State: returned→upgraded
Works, and no timeout. Thank you.
State: upgraded→closed