deobfuscate strings

git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@408 379699f6-c40d-0410-875b-85095c16579e
stable
jochen 26 years ago
parent 2d28ebd78e
commit 2d5f3a9848
  1. 9
      jode/jode/expr/ComplexExpression.java
  2. 39
      jode/jode/expr/InvokeOperator.java

@ -418,7 +418,14 @@ public class ComplexExpression extends Expression {
return new ComplexExpression return new ComplexExpression
(new StringAddOperator(), new Expression[] (new StringAddOperator(), new Expression[]
{ left, right }); { left, right });
} } else if (Decompiler.stringDecrypting) {
Expression expr = subExpressions[0].simplifyString();
if (expr instanceof ConstOperator) {
expr = invoke.deobfuscateString((ConstOperator)expr);
if (expr != null)
return expr;
}
}
} }
return this; return this;
} }

@ -19,9 +19,12 @@
package jode.expr; package jode.expr;
import jode.decompiler.CodeAnalyzer; import jode.decompiler.CodeAnalyzer;
import jode.decompiler.ClassAnalyzer;
import jode.MethodType; import jode.MethodType;
import jode.Decompiler;
import jode.Type; import jode.Type;
import jode.bytecode.ClassInfo; import jode.bytecode.*;
import jode.jvm.*;
public final class InvokeOperator extends Operator public final class InvokeOperator extends Operator
implements MatchableOperator { implements MatchableOperator {
@ -168,6 +171,40 @@ public final class InvokeOperator extends Operator
.getMethod(methodName, methodType).isGetClass(); .getMethod(methodName, methodType).isGetClass();
} }
public ConstOperator deobfuscateString(ConstOperator op) {
if (!isThis() || !isStatic()
|| methodType.getParameterTypes().length != 1
|| !methodType.getParameterTypes()[0].equals(Type.tString)
|| !methodType.getReturnType().equals(Type.tString))
return null;
ClassAnalyzer clazz = codeAnalyzer.getClassAnalyzer();
CodeAnalyzer ca = clazz.getMethod(methodName, methodType).getCode();
if (ca == null)
return null;
CodeInfo info = ca.getCodeInfo();
Value[] locals = new Value[info.getMaxLocals()];
for (int i=0; i< locals.length; i++)
locals[i] = new Value();
Value[] stack = new Value[info.getMaxStack()];
for (int i=0; i< stack.length; i++)
stack[i] = new Value();
locals[0].setObject(op.getValue());
String result;
try {
result = (String) Interpreter.interpretMethod
(clazz, info.getCode(), locals, stack);
} catch (InterpreterException ex) {
Decompiler.err.println("Warning: Can't interpret method "
+methodName);
ex.printStackTrace(Decompiler.err);
return null;
} catch (ClassFormatException ex) {
ex.printStackTrace(Decompiler.err);
return null;
}
return new ConstOperator(Type.tString, result);
}
/* Invokes never equals: they may return different values even if /* Invokes never equals: they may return different values even if
* they have the same parameters. * they have the same parameters.
*/ */

Loading…
Cancel
Save