unnecessarry try-catch removed from deobfuscarot methods

This commit is contained in:
2015-08-30 08:25:30 +02:00
parent edb9f124cb
commit f51640276a
7 changed files with 314 additions and 324 deletions
@@ -36,7 +36,6 @@ import com.jpexs.decompiler.flash.action.model.SetPropertyActionItem;
import com.jpexs.decompiler.flash.action.model.SetVariableActionItem;
import com.jpexs.decompiler.flash.action.model.StoreRegisterActionItem;
import com.jpexs.decompiler.flash.action.model.TemporaryRegister;
import com.jpexs.decompiler.flash.action.model.UnsupportedActionItem;
import com.jpexs.decompiler.flash.action.model.clauses.ClassActionItem;
import com.jpexs.decompiler.flash.action.model.clauses.InterfaceActionItem;
import com.jpexs.decompiler.flash.action.parser.ActionParseException;
@@ -83,7 +82,6 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EmptyStackException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -1132,13 +1130,7 @@ public abstract class Action implements GraphSourceItem {
ip = ip + 1 + store.getStoreSize() - 1/*ip++ will be next*/;
}
try {
action.translate(localData, stack, output, staticOperation, path);
} catch (EmptyStackException ese) {
logger.log(Level.SEVERE, "Decompilation error in: " + path, ese);
output.add(new UnsupportedActionItem(action, "Empty stack"));
}
action.translate(localData, stack, output, staticOperation, path);
}
ip++;
@@ -65,7 +65,6 @@ import com.jpexs.decompiler.graph.TranslateException;
import com.jpexs.decompiler.graph.TranslateStack;
import java.io.IOException;
import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -234,177 +233,174 @@ public class ActionDeobfuscator extends ActionDeobfuscatorSimple {
int instructionsProcessed = 0;
ActionConstantPool lastConstantPool = null;
try {
while (true) {
if (idx > endIdx) {
while (true) {
if (idx > endIdx) {
break;
}
Action action = actions.get(idx);
instructionsProcessed++;
if (instructionsProcessed > executionLimit) {
break;
}
/*System.out.print(action.getASMSource(actions, new ArrayList<Long>(), ScriptExportMode.PCODE));
for (int j = 0; j < stack.size(); j++) {
System.out.print(" '" + stack.get(j).getResult() + "'");
}
System.out.println();*/
if (action instanceof ActionConstantPool) {
lastConstantPool = (ActionConstantPool) action;
}
if (action instanceof ActionDefineLocal) {
if (stack.size() < 2) {
return;
}
String variableName = stack.peek(2).getResult().toString();
result.defines.add(variableName);
}
if (action instanceof ActionGetVariable) {
if (stack.isEmpty()) {
return;
}
String variableName = stack.peek().getResult().toString();
if (!localData.variables.containsKey(variableName)) {
break;
}
}
Action action = actions.get(idx);
instructionsProcessed++;
if (instructionsProcessed > executionLimit) {
break;
if (action instanceof ActionCallFunction) {
if (stack.isEmpty()) {
return;
}
/*System.out.print(action.getASMSource(actions, new ArrayList<Long>(), ScriptExportMode.PCODE));
for (int j = 0; j < stack.size(); j++) {
System.out.print(" '" + stack.get(j).getResult() + "'");
}
System.out.println();*/
if (action instanceof ActionConstantPool) {
lastConstantPool = (ActionConstantPool) action;
}
if (action instanceof ActionDefineLocal) {
if (stack.size() < 2) {
return;
}
String variableName = stack.peek(2).getResult().toString();
result.defines.add(variableName);
}
if (action instanceof ActionGetVariable) {
if (stack.isEmpty()) {
return;
}
String variableName = stack.peek().getResult().toString();
if (!localData.variables.containsKey(variableName)) {
break;
}
}
if (action instanceof ActionCallFunction) {
if (stack.isEmpty()) {
return;
}
String functionName = stack.pop().getResult().toString();
long numArgs = EcmaScript.toUint32(stack.pop().getResult());
if (numArgs == 0) {
if (fakeFunctions != null && fakeFunctions.containsKey(functionName)) {
stack.push(new DirectValueActionItem(fakeFunctions.get(functionName)));
} else {
break;
}
String functionName = stack.pop().getResult().toString();
long numArgs = EcmaScript.toUint32(stack.pop().getResult());
if (numArgs == 0) {
if (fakeFunctions != null && fakeFunctions.containsKey(functionName)) {
stack.push(new DirectValueActionItem(fakeFunctions.get(functionName)));
} else {
break;
}
} else {
// do not throw EmptyStackException, much faster
int requiredStackSize = action.getStackPopCount(localData, stack);
if (stack.size() < requiredStackSize) {
return;
}
action.translate(localData, stack, output, Graph.SOP_USE_STATIC, "");
}
if (!(action instanceof ActionPush
|| action instanceof ActionPushDuplicate
|| action instanceof ActionAdd
|| action instanceof ActionAdd2
|| action instanceof ActionIncrement
|| action instanceof ActionDecrement
|| action instanceof ActionSubtract
|| action instanceof ActionModulo
|| action instanceof ActionMultiply
|| action instanceof ActionBitXor
|| action instanceof ActionBitAnd
|| action instanceof ActionBitOr
|| action instanceof ActionBitLShift
|| action instanceof ActionBitRShift
|| action instanceof ActionDefineLocal
|| action instanceof ActionJump
|| action instanceof ActionGetVariable
|| action instanceof ActionSetVariable
|| action instanceof ActionEquals
|| action instanceof ActionEquals2
|| action instanceof ActionLess
|| action instanceof ActionLess2
|| action instanceof ActionGreater
|| action instanceof ActionNot
|| action instanceof ActionIf
|| action instanceof ActionConstantPool
|| action instanceof ActionCallFunction
|| action instanceof ActionReturn
|| action instanceof ActionEnd)) {
break;
}
} else {
// do not throw EmptyStackException, much faster
int requiredStackSize = action.getStackPopCount(localData, stack);
if (stack.size() < requiredStackSize) {
return;
}
if (action instanceof ActionPush) {
ActionPush push = (ActionPush) action;
boolean ok = true;
for (Object value : push.values) {
if ((constantPool == null && value instanceof ConstantIndex) || value instanceof RegisterNumber) {
ok = false;
break;
}
}
if (!ok) {
action.translate(localData, stack, output, Graph.SOP_USE_STATIC, "");
}
if (!(action instanceof ActionPush
|| action instanceof ActionPushDuplicate
|| action instanceof ActionAdd
|| action instanceof ActionAdd2
|| action instanceof ActionIncrement
|| action instanceof ActionDecrement
|| action instanceof ActionSubtract
|| action instanceof ActionModulo
|| action instanceof ActionMultiply
|| action instanceof ActionBitXor
|| action instanceof ActionBitAnd
|| action instanceof ActionBitOr
|| action instanceof ActionBitLShift
|| action instanceof ActionBitRShift
|| action instanceof ActionDefineLocal
|| action instanceof ActionJump
|| action instanceof ActionGetVariable
|| action instanceof ActionSetVariable
|| action instanceof ActionEquals
|| action instanceof ActionEquals2
|| action instanceof ActionLess
|| action instanceof ActionLess2
|| action instanceof ActionGreater
|| action instanceof ActionNot
|| action instanceof ActionIf
|| action instanceof ActionConstantPool
|| action instanceof ActionCallFunction
|| action instanceof ActionReturn
|| action instanceof ActionEnd)) {
break;
}
if (action instanceof ActionPush) {
ActionPush push = (ActionPush) action;
boolean ok = true;
for (Object value : push.values) {
if ((constantPool == null && value instanceof ConstantIndex) || value instanceof RegisterNumber) {
ok = false;
break;
}
}
/*for (String variable : localData.variables.keySet()) {
System.out.println(Helper.byteArrToString(variable.getBytes()));
}*/
idx++;
if (action instanceof ActionJump) {
ActionJump jump = (ActionJump) action;
long address = jump.getAddress() + jump.getTotalActionLength() + jump.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("Jump target not found: " + address);
}
}
if (action instanceof ActionIf) {
ActionIf aif = (ActionIf) action;
if (stack.isEmpty()) {
return;
}
if (EcmaScript.toBoolean(stack.pop().getResult())) {
long address = aif.getAddress() + aif.getTotalActionLength() + aif.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("If target not found: " + address);
}
}
}
if (action instanceof ActionDefineFunction) {
List<Action> lastActions = actions.getContainerLastActions(action);
int lastActionIdx = actions.indexOf(lastActions.get(0));
idx = lastActionIdx != -1 ? lastActionIdx + 1 : -1;
}
if (/*localData.variables.size() == 1 && */stack.allItemsFixed() || action instanceof ActionEnd) {
result.idx = idx == actions.size() ? idx - 1 : idx;
result.instructionsProcessed = instructionsProcessed;
result.constantPool = lastConstantPool;
result.variables.clear();
for (String variableName : localData.variables.keySet()) {
Object value = localData.variables.get(variableName).getResult();
result.variables.put(variableName, value);
}
result.stack.clear();
result.stack.addAll(stack);
}
if (action instanceof ActionReturn) {
if (output.size() > 0) {
ReturnActionItem ret = (ReturnActionItem) output.get(output.size() - 1);
result.resultValue = ret.value.getResult();
}
if (!ok) {
break;
}
}
} catch (EmptyStackException | TranslateException ex) {
/*for (String variable : localData.variables.keySet()) {
System.out.println(Helper.byteArrToString(variable.getBytes()));
}*/
idx++;
if (action instanceof ActionJump) {
ActionJump jump = (ActionJump) action;
long address = jump.getAddress() + jump.getTotalActionLength() + jump.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("Jump target not found: " + address);
}
}
if (action instanceof ActionIf) {
ActionIf aif = (ActionIf) action;
if (stack.isEmpty()) {
return;
}
if (EcmaScript.toBoolean(stack.pop().getResult())) {
long address = aif.getAddress() + aif.getTotalActionLength() + aif.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("If target not found: " + address);
}
}
}
if (action instanceof ActionDefineFunction) {
List<Action> lastActions = actions.getContainerLastActions(action);
int lastActionIdx = actions.indexOf(lastActions.get(0));
idx = lastActionIdx != -1 ? lastActionIdx + 1 : -1;
}
if (/*localData.variables.size() == 1 && */stack.allItemsFixed() || action instanceof ActionEnd) {
result.idx = idx == actions.size() ? idx - 1 : idx;
result.instructionsProcessed = instructionsProcessed;
result.constantPool = lastConstantPool;
result.variables.clear();
for (String variableName : localData.variables.keySet()) {
Object value = localData.variables.get(variableName).getResult();
result.variables.put(variableName, value);
}
result.stack.clear();
result.stack.addAll(stack);
}
if (action instanceof ActionReturn) {
if (output.size() > 0) {
ReturnActionItem ret = (ReturnActionItem) output.get(output.size() - 1);
result.resultValue = ret.value.getResult();
}
break;
}
}
}
@@ -52,7 +52,6 @@ import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TranslateException;
import com.jpexs.decompiler.graph.TranslateStack;
import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -274,102 +273,99 @@ public class ActionDeobfuscatorSimple implements SWFDecompilerListener {
FixItemCounterTranslateStack stack = new FixItemCounterTranslateStack("");
int instructionsProcessed = 0;
try {
while (true) {
if (idx > endIdx) {
break;
}
while (true) {
if (idx > endIdx) {
break;
}
if (instructionsProcessed > executionLimit) {
break;
}
if (instructionsProcessed > executionLimit) {
break;
}
Action action = actions.get(idx);
Action action = actions.get(idx);
/*System.out.print(action.getASMSource(actions, new ArrayList<Long>(), ScriptExportMode.PCODE));
for (int j = 0; j < stack.size(); j++) {
System.out.print(" '" + stack.get(j).getResult() + "'");
}
System.out.println();*/
// do not throw EmptyStackException, much faster
int requiredStackSize = action.getStackPopCount(localData, stack);
if (stack.size() < requiredStackSize) {
return;
}
/*System.out.print(action.getASMSource(actions, new ArrayList<Long>(), ScriptExportMode.PCODE));
for (int j = 0; j < stack.size(); j++) {
System.out.print(" '" + stack.get(j).getResult() + "'");
}
System.out.println();*/
// do not throw EmptyStackException, much faster
int requiredStackSize = action.getStackPopCount(localData, stack);
if (stack.size() < requiredStackSize) {
return;
}
action.translate(localData, stack, output, Graph.SOP_USE_STATIC, "");
action.translate(localData, stack, output, Graph.SOP_USE_STATIC, "");
if (!(action instanceof ActionPush
|| action instanceof ActionPushDuplicate
|| action instanceof ActionCharToAscii
|| action instanceof ActionAdd
|| action instanceof ActionAdd2
|| action instanceof ActionSubtract
|| action instanceof ActionModulo
|| action instanceof ActionMultiply
|| action instanceof ActionBitXor
|| action instanceof ActionBitAnd
|| action instanceof ActionBitOr
|| action instanceof ActionBitLShift
|| action instanceof ActionBitRShift
|| action instanceof ActionEquals
|| action instanceof ActionNot
|| action instanceof ActionIf
|| action instanceof ActionJump)) {
break;
}
if (!(action instanceof ActionPush
|| action instanceof ActionPushDuplicate
|| action instanceof ActionCharToAscii
|| action instanceof ActionAdd
|| action instanceof ActionAdd2
|| action instanceof ActionSubtract
|| action instanceof ActionModulo
|| action instanceof ActionMultiply
|| action instanceof ActionBitXor
|| action instanceof ActionBitAnd
|| action instanceof ActionBitOr
|| action instanceof ActionBitLShift
|| action instanceof ActionBitRShift
|| action instanceof ActionEquals
|| action instanceof ActionNot
|| action instanceof ActionIf
|| action instanceof ActionJump)) {
break;
}
if (action instanceof ActionPush) {
ActionPush push = (ActionPush) action;
boolean ok = true;
instructionsProcessed += push.values.size() - 1;
for (Object value : push.values) {
if (value instanceof ConstantIndex || value instanceof RegisterNumber) {
ok = false;
break;
}
}
if (!ok) {
if (action instanceof ActionPush) {
ActionPush push = (ActionPush) action;
boolean ok = true;
instructionsProcessed += push.values.size() - 1;
for (Object value : push.values) {
if (value instanceof ConstantIndex || value instanceof RegisterNumber) {
ok = false;
break;
}
}
idx++;
if (action instanceof ActionJump) {
ActionJump jump = (ActionJump) action;
long address = jump.getAddress() + jump.getTotalActionLength() + jump.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("Jump target not found: " + address);
}
}
if (action instanceof ActionIf) {
ActionIf aif = (ActionIf) action;
if (stack.isEmpty()) {
return;
}
if (EcmaScript.toBoolean(stack.pop().getResult())) {
long address = aif.getAddress() + aif.getTotalActionLength() + aif.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("If target not found: " + address);
}
}
}
instructionsProcessed++;
if (stack.allItemsFixed()) {
result.idx = idx == actions.size() ? idx - 1 : idx;
result.instructionsProcessed = instructionsProcessed;
result.stack.clear();
result.stack.addAll(stack);
if (!ok) {
break;
}
}
} catch (EmptyStackException | TranslateException ex) {
idx++;
if (action instanceof ActionJump) {
ActionJump jump = (ActionJump) action;
long address = jump.getAddress() + jump.getTotalActionLength() + jump.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("Jump target not found: " + address);
}
}
if (action instanceof ActionIf) {
ActionIf aif = (ActionIf) action;
if (stack.isEmpty()) {
return;
}
if (EcmaScript.toBoolean(stack.pop().getResult())) {
long address = aif.getAddress() + aif.getTotalActionLength() + aif.getJumpOffset();
idx = actions.indexOf(actions.getByAddress(address));
if (idx == -1) {
throw new TranslateException("If target not found: " + address);
}
}
}
instructionsProcessed++;
if (stack.allItemsFixed()) {
result.idx = idx == actions.size() ? idx - 1 : idx;
result.instructionsProcessed = instructionsProcessed;
result.stack.clear();
result.stack.addAll(stack);
}
}
}