deobfuscation fix

try..return
This commit is contained in:
Jindra Petřík
2021-01-24 21:15:19 +01:00
parent dabb1880fb
commit 70e421ec06
10 changed files with 90 additions and 12 deletions

View File

@@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.ScopeStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -81,6 +82,16 @@ public class AVM2LocalData extends BaseLocalData {
}
public Set<Integer> getSetLocalUsages(int setLocalPos) {
if (setLocalPosToGetLocalPos == null) {
return new HashSet<>();
}
if (!setLocalPosToGetLocalPos.containsKey(setLocalPos)) {
return new HashSet<>();
}
return setLocalPosToGetLocalPos.get(setLocalPos);
}
public AVM2LocalData(AVM2LocalData localData) {
isStatic = localData.isStatic;
classIndex = localData.classIndex;

View File

@@ -1602,7 +1602,7 @@ public class AVM2Code implements Cloneable {
}*/
if ((ins.definition instanceof SetLocalTypeIns) && (ip + 1 <= end)) { // set_local_x,get_local_x.. no other local_x get
AVM2Instruction insAfter = code.get(ip + 1);
Set<Integer> usages = setLocalPosToGetLocalPos.get(ip);
Set<Integer> usages = setLocalPosToGetLocalPos.containsKey(ip) ? setLocalPosToGetLocalPos.get(ip) : new HashSet<>();
if (usages.size() == 1 && (usages.iterator().next().equals(ip + 1)) && (insAfter.definition instanceof GetLocalTypeIns) && (((GetLocalTypeIns) insAfter.definition).getRegisterId(insAfter) == ((SetLocalTypeIns) ins.definition).getRegisterId(ins))) {
ip += 2;

View File

@@ -1055,7 +1055,7 @@ public class AVM2Graph extends Graph {
SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(i);
if (setLocal.regIndex == objRegIndex) {
int setLocalIp = aLocalData.code.adr2pos(setLocal.getSrc().getAddress());
Set<Integer> objUsages = new HashSet<>(aLocalData.setLocalPosToGetLocalPos.get(setLocalIp));
Set<Integer> objUsages = new HashSet<>(aLocalData.getSetLocalUsages(setLocalIp));
int hnUsageIp = aLocalData.code.adr2pos(hn.getSrc().getAddress());
objUsages.remove(hnUsageIp);
@@ -1097,7 +1097,7 @@ public class AVM2Graph extends Graph {
SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(i);
if (setLocal.regIndex == indexRegIndex) {
int setLocalIp = aLocalData.code.adr2pos(setLocal.getSrc().getAddress());
Set<Integer> objUsages = new HashSet<>(aLocalData.setLocalPosToGetLocalPos.get(setLocalIp));
Set<Integer> objUsages = new HashSet<>(aLocalData.getSetLocalUsages(setLocalIp));
int hnUsageIp = aLocalData.code.adr2pos(hn.getSrc().getAddress());
objUsages.remove(hnUsageIp);
@@ -1191,7 +1191,29 @@ public class AVM2Graph extends Graph {
continue;
}
}
if (usages.size() <= 1) {
//if (usages.size() <= 1)
{
if (i + 1 < list.size()) {
if ((list.get(i + 1) instanceof ReturnValueAVM2Item)
&& (list.get(i + 1).value instanceof LocalRegAVM2Item)
&& (((LocalRegAVM2Item) list.get(i + 1).value).regIndex == ri.regIndex)) {
ReturnValueAVM2Item r = (ReturnValueAVM2Item) list.get(i + 1);
r.value = ri.value;
list.remove(i);
i--;
continue;
}
if ((list.get(i + 1) instanceof ThrowAVM2Item)
&& (list.get(i + 1).value instanceof LocalRegAVM2Item)
&& (((LocalRegAVM2Item) list.get(i + 1).value).regIndex == ri.regIndex)) {
ThrowAVM2Item t = (ThrowAVM2Item) list.get(i + 2);
t.value = ri.value;
list.remove(i);
i--;
continue;
}
}
if (i + 2 < list.size()) {
if ((list.get(i + 1) instanceof IntegerValueAVM2Item) && (list.get(i + 2) instanceof ReturnValueAVM2Item)
&& (list.get(i + 2).value instanceof LocalRegAVM2Item)
@@ -1211,7 +1233,7 @@ public class AVM2Graph extends Graph {
list.remove(i + 1);
list.remove(i);
i--;
//continue;
continue;
}
} else if (i + 1 < list.size() && usages.isEmpty()) {
if (list.get(i + 1) instanceof IntegerValueAVM2Item) {
@@ -1304,7 +1326,7 @@ public class AVM2Graph extends Graph {
AVM2LocalData avm2LocalData = (AVM2LocalData) localData;
SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(output.size() - 1);
int setLocalIp = InstructionDefinition.getItemIp(avm2LocalData, setLocal);;
Set<Integer> allUsages = new HashSet<>(avm2LocalData.setLocalPosToGetLocalPos.get(setLocalIp));
Set<Integer> allUsages = new HashSet<>(avm2LocalData.getSetLocalUsages(setLocalIp));
for (GraphTargetItem otherSide : otherSides.values()) {
if (otherSide instanceof LocalRegAVM2Item) {
LocalRegAVM2Item otherLog = (LocalRegAVM2Item) otherSide;

View File

@@ -328,7 +328,7 @@ public abstract class InstructionDefinition implements Serializable {
SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(i);
if (setLocal.regIndex == reg.regIndex) {
int setLocalIp = getItemIp(localData, setLocal);
Set<Integer> usages = localData.setLocalPosToGetLocalPos.get(setLocalIp);
Set<Integer> usages = localData.getSetLocalUsages(setLocalIp);
int usageIp = getItemIp(localData, reg);
if (usages.size() == 1 && usages.iterator().next().equals(usageIp)) {
output.remove(i);

View File

@@ -96,7 +96,7 @@ public abstract class GetLocalTypeIns extends InstructionDefinition {
int setLocalIp = getItemIp(localData, setLocal);
int getLocalIp = localData.code.adr2pos(ins.getAddress());
Set<Integer> usages = localData.setLocalPosToGetLocalPos.get(setLocalIp);
Set<Integer> usages = localData.getSetLocalUsages(setLocalIp);
if (usages.size() == 1 && usages.iterator().next().equals(getLocalIp)) {
output.remove(output.size() - 1);
output.remove(output.size() - 1);

View File

@@ -37,6 +37,7 @@ import com.jpexs.decompiler.flash.abc.types.MethodBody;
import com.jpexs.decompiler.graph.DottedChain;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TranslateStack;
import com.jpexs.decompiler.graph.model.DuplicateItem;
import com.jpexs.decompiler.graph.model.PopItem;
import java.util.HashMap;
import java.util.List;
@@ -128,6 +129,9 @@ public abstract class SetLocalTypeIns extends InstructionDefinition implements S
}
}
if (localData.getSetLocalUsages(localData.code.adr2pos(ins.getAddress())).isEmpty() && (value instanceof DuplicateItem)) {
return;
}
GraphTargetItem result = new SetLocalAVM2Item(ins, localData.lineStartInstruction, regId, value);
output.add(result);
}

View File

@@ -49,10 +49,8 @@ public class DuplicateItem extends GraphTargetItem implements SimpleValue {
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if (!Configuration.displayDupInstructions.get()) {
if (((value instanceof SimpleValue) && (((SimpleValue) value).isSimpleValue())) || !Configuration.displayDupInstructions.get()) {
return value.appendTry(writer, localData);
}
if (((value instanceof SimpleValue) && (((SimpleValue) value).isSimpleValue())) || !Configuration.displayDupInstructions.get()) {
return value.appendTry(writer, localData);
}
writer.append("§§dup(");
value.appendTry(writer, localData);