mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-02 20:04:37 +00:00
deobfuscation fix
try..return
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user