per method,lvt deadops, but this appears to produce broken code?

This commit is contained in:
Adam
2015-08-05 17:03:49 -04:00
parent 9c3b0b4754
commit ba4f23ffbd

View File

@@ -121,6 +121,12 @@ public class ConstantParameter implements Deobfuscator
// get(descriptor.size() - 1) == first parameter // get(descriptor.size() - 1) == first parameter
StackContext ctx = pops.get(method.getDescriptor().size() - 1 - parameterIndex); StackContext ctx = pops.get(method.getDescriptor().size() - 1 - parameterIndex);
Collection<Integer> nonIdx = nonconst.getCollection(method);
boolean non = nonIdx != null && nonIdx.contains(parameterIndex);
if (non)
continue;
if (ctx.getPushed().getInstruction() instanceof PushConstantInstruction) if (ctx.getPushed().getInstruction() instanceof PushConstantInstruction)
{ {
PushConstantInstruction pc = (PushConstantInstruction) ctx.getPushed().getInstruction(); PushConstantInstruction pc = (PushConstantInstruction) ctx.getPushed().getInstruction();
@@ -321,8 +327,50 @@ public class ConstantParameter implements Deobfuscator
return ops; return ops;
} }
private Map<Method, List<LogicallyDeadOp> > deadops = new HashMap<>(); private static class MethodLvtPair
private Set<Method> invalidDeadops = new HashSet<>(); {
Method method;
int lvtIndex;
public MethodLvtPair(Method method, int lvtIndex)
{
this.method = method;
this.lvtIndex = lvtIndex;
}
@Override
public int hashCode()
{
int hash = 7;
hash = 41 * hash + Objects.hashCode(this.method);
hash = 41 * hash + this.lvtIndex;
return hash;
}
@Override
public boolean equals(Object obj)
{
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MethodLvtPair other = (MethodLvtPair) obj;
if (!Objects.equals(this.method, other.method)) {
return false;
}
if (this.lvtIndex != other.lvtIndex) {
return false;
}
return true;
}
}
private Map<MethodLvtPair, List<LogicallyDeadOp> > deadops = new HashMap<>();
private Set<MethodLvtPair> invalidDeadops = new HashSet<>();
// check every method parameter that we've identified as being passed constants to see if it's logically dead // check every method parameter that we've identified as being passed constants to see if it's logically dead
private void findLogicallyDeadOperations(Execution execution) private void findLogicallyDeadOperations(Execution execution)
@@ -332,19 +380,22 @@ public class ConstantParameter implements Deobfuscator
{ {
for (Method method : cmp.methods) for (Method method : cmp.methods)
{ {
if (invalidDeadops.contains(method)) MethodLvtPair pair = new MethodLvtPair(method, cmp.lvtIndex);
if (invalidDeadops.contains(pair))
continue; continue;
// the dead comparisons must be the same and branch the same way for every call to this method. // the dead comparisons must be the same and branch the same way for every call to this method.
List<LogicallyDeadOp> deadOps = isLogicallyDead(execution, method, cmp.lvtIndex, cmp.value); List<LogicallyDeadOp> deadOps = isLogicallyDead(execution, method, cmp.lvtIndex, cmp.value);
List<LogicallyDeadOp> existing = deadops.get(method); // this must be per method,lvtindex
List<LogicallyDeadOp> existing = deadops.get(pair);
if (existing != null) if (existing != null)
if (!existing.equals(deadOps)) if (!existing.equals(deadOps))
{ {
// one of the branches taken differs because of the value, skip it // one of the branches taken differs because of the value, skip it
deadops.remove(method); deadops.remove(pair);
invalidDeadops.add(method); invalidDeadops.add(pair);
continue; continue;
} }
else else
@@ -352,7 +403,7 @@ public class ConstantParameter implements Deobfuscator
continue; continue;
} }
deadops.put(method, deadOps); deadops.put(pair, deadOps);
} }
} }
} }
@@ -361,9 +412,10 @@ public class ConstantParameter implements Deobfuscator
private int removeDeadOperations() private int removeDeadOperations()
{ {
int count = 0; int count = 0;
for (Method method : deadops.keySet()) for (MethodLvtPair mvp : deadops.keySet())
{ {
List<LogicallyDeadOp> ops = deadops.get(method); Method method = mvp.method;
List<LogicallyDeadOp> ops = deadops.get(mvp);
for (LogicallyDeadOp op : ops) for (LogicallyDeadOp op : ops)
{ {
@@ -396,6 +448,8 @@ public class ConstantParameter implements Deobfuscator
// just go to next instruction // just go to next instruction
to = instructions.getInstructions().get(idx + 1); to = instructions.getInstructions().get(idx + 1);
} }
assert to.getInstructions() == instructions;
assert ins != to;
// move things that jump here to instead jump to 'to' // move things that jump here to instead jump to 'to'
for (Instruction fromI : ins.from) for (Instruction fromI : ins.from)