Added #270 AS3 show progress on deofuscating p-code

This commit is contained in:
Jindra Petřík
2021-12-05 19:09:53 +01:00
parent 97760b766d
commit 3dd2885358
9 changed files with 48 additions and 7 deletions
@@ -0,0 +1,9 @@
package com.jpexs.decompiler.flash;
/**
*
* @author JPEXS
*/
public interface DeobfuscationListener {
public void itemDeobfuscated();
}
@@ -168,6 +168,7 @@ import com.jpexs.helpers.Helper;
import com.jpexs.helpers.ImmediateFuture;
import com.jpexs.helpers.NulStream;
import com.jpexs.helpers.ProgressListener;
import com.jpexs.helpers.Reference;
import com.jpexs.helpers.SerializableImage;
import com.jpexs.helpers.utf8.Utf8Helper;
import java.awt.AlphaComposite;
@@ -3353,13 +3354,24 @@ public final class SWF implements SWFContainerItem, Timelined {
public void deobfuscate(DeobfuscationLevel level) throws InterruptedException {
List<ABCContainerTag> atags = getAbcList();
int apos = 0;
for (ABCContainerTag tag : atags) {
apos++;
final int fpos = apos;
Reference<Integer> numDeoScripts = new Reference<>(0);
DeobfuscationListener deoListener = new DeobfuscationListener() {
@Override
public void itemDeobfuscated() {
numDeoScripts.setVal(numDeoScripts.getVal() + 1);
informListeners("deobfuscate_pcode", "abc " + fpos + "/" + atags.size() + " script " + numDeoScripts.getVal() + "/" + tag.getABC().script_info.size());
}
};
if (level == DeobfuscationLevel.LEVEL_REMOVE_DEAD_CODE) {
tag.getABC().removeDeadCode();
tag.getABC().removeDeadCode(deoListener);
} else if (level == DeobfuscationLevel.LEVEL_REMOVE_TRAPS) {
tag.getABC().removeTraps();
tag.getABC().removeTraps(deoListener);
} else if (level == DeobfuscationLevel.LEVEL_RESTORE_CONTROL_FLOW) {
tag.getABC().removeTraps();
tag.getABC().removeTraps(deoListener);
}
((Tag) tag).setModified(true);
@@ -16,6 +16,7 @@
*/
package com.jpexs.decompiler.flash.abc;
import com.jpexs.decompiler.flash.DeobfuscationListener;
import com.jpexs.decompiler.flash.EndOfStreamException;
import com.jpexs.decompiler.flash.EventListener;
import com.jpexs.decompiler.flash.SWF;
@@ -232,14 +233,24 @@ public class ABC {
}
public int removeTraps() throws InterruptedException {
return removeTraps(null);
}
public int removeTraps(DeobfuscationListener listener) throws InterruptedException {
int rem = 0;
for (int s = 0; s < script_info.size(); s++) {
rem += script_info.get(s).removeTraps(s, this, "");
if (listener != null) {
listener.itemDeobfuscated();
}
}
return rem;
}
public int removeDeadCode() throws InterruptedException {
return removeDeadCode(null);
}
public int removeDeadCode(DeobfuscationListener listener) throws InterruptedException {
int rem = 0;
for (MethodBody body : bodies) {
rem += body.removeDeadCode(constants, null/*FIXME*/, method_info.get(body.method_info));