-
-
Save AKosterin/af8c2dd2aa372c99b507 to your computer and use it in GitHub Desktop.
import jeb.api.IScript; | |
import jeb.api.JebInstance; | |
import jeb.api.ast.*; | |
import jeb.api.ast.Class; | |
import jeb.api.dex.*; | |
import jeb.api.ui.JavaView; | |
import jeb.api.ui.View; | |
import java.util.Arrays; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.regex.Pattern; | |
/** | |
* Created by AKosterin on 31/01/16. | |
*/ | |
public class DexGuardDecoder implements IScript { | |
private static JebInstance mJebInstance; | |
private static HashMap<String,byte[]> staticByteArrays; | |
private static HashMap<String,Integer> staticIntegers; | |
private static String decoderMethodSignature; | |
private static boolean debug = false; | |
@Override | |
public void run(JebInstance jebInstance) { | |
mJebInstance = jebInstance; | |
mJebInstance.print("DexGuardDecoder_Start"); | |
if (!mJebInstance.isFileLoaded()) { | |
mJebInstance.print("Please load a dex file"); | |
return; | |
} | |
Dex mDex = mJebInstance.getDex(); | |
JavaView view = (JavaView) jebInstance.getUI().getView(View.Type.JAVA); | |
String signature = view.getCodePosition().getSignature(); | |
if (debug) mJebInstance.print(getClassFromSignature(signature)); | |
Class mClass = mJebInstance.getDecompiledClassTree(getClassFromSignature(signature)); | |
defineDecoderMethodSignature(mClass); | |
if(!decoderMethodSignature.isEmpty()){ | |
normalizeDecoderMethod(); | |
initDecoderValues(mClass); | |
for (Method mMethod : (List<Method>) mClass.getMethods()) { | |
decodeMethod(mMethod); | |
} | |
} | |
jebInstance.getUI().getView(View.Type.JAVA).refresh(); | |
jebInstance.print("DexGuardStringDecoder_End"); | |
} | |
private static void defineDecoderMethodSignature(Class mClass){ | |
for (Method mMethod : (List<Method>) mClass.getMethods()) { | |
String mMethodSignature = mMethod.getSignature(); | |
if(mMethod.isStatic() && Pattern.matches("^.*[(][IBS]{3}[)]Ljava[/]lang[/]String[;]$",mMethodSignature.split(">")[1])){ | |
decoderMethodSignature = mMethodSignature; | |
if (debug) mJebInstance.print("decoderMethodSignature = " + decoderMethodSignature); | |
return; | |
} | |
} | |
} | |
private static void normalizeDecoderMethod(){ | |
Method mMethod = mJebInstance.getDecompiledMethodTree(decoderMethodSignature); | |
Block mMethodBodyBlock = mMethod.getBody(); | |
int ifStmLine = 0; | |
while(!(mMethodBodyBlock.get(ifStmLine) instanceof IfStm)){ | |
ifStmLine++; | |
if(ifStmLine == mMethodBodyBlock.size()){ | |
return; | |
} | |
} | |
Block mElseBlock = ((IfStm)mMethodBodyBlock.get(ifStmLine)).getDefaultBlock(); | |
Block mWhileBlock = Block.build(); | |
int labelLine = 0; | |
while(!(mElseBlock.get(0) instanceof Label)){ | |
mMethodBodyBlock.insert(ifStmLine + labelLine, mElseBlock.get(0)); | |
mElseBlock.remove(0); | |
labelLine++; | |
} | |
for (int i = 0; i < mElseBlock.size() - 1; i++) { | |
if(mElseBlock.get(i+1) instanceof IfStm){ | |
IfStm mIfStm = (IfStm) mElseBlock.get(i+1); | |
Predicate mIfPredicate = mIfStm.getBranchPredicate(0); | |
Block mIfIfBlock = mIfStm.getBranchBody(0); | |
Block mIfElseBlock = mIfStm.getDefaultBlock(); | |
mWhileBlock.insert(mWhileBlock.size(), IfStm.build(mIfPredicate,mIfIfBlock)); | |
for (int k = 0; k < mIfElseBlock.size(); k++) { | |
mWhileBlock.insert(mWhileBlock.size(), mIfElseBlock.get(k)); | |
} | |
} else { | |
mWhileBlock.insert(mWhileBlock.size(), mElseBlock.get(i + 1)); | |
} | |
} | |
int size = mMethodBodyBlock.size() - ifStmLine - labelLine - 2; | |
for (int i = 0; i < size; i++) { | |
mWhileBlock.insert(mWhileBlock.size(), mMethodBodyBlock.get(ifStmLine + labelLine + 1)); | |
mMethodBodyBlock.remove(ifStmLine+labelLine + 1); | |
} | |
mMethodBodyBlock.remove(ifStmLine + labelLine + 1); | |
IExpression mIExpression = new Constant.Builder(mJebInstance).buildInt(1); | |
Predicate mTruePredicate = Predicate.build(mIExpression, Operator.EQ, mIExpression); | |
WhileStm mWhileStm = WhileStm.build(mTruePredicate,mWhileBlock); | |
mMethodBodyBlock.replaceSubElement(mMethodBodyBlock.get(ifStmLine+labelLine), mWhileStm); | |
} | |
private static void initDecoderValues(Class mClass) { | |
staticByteArrays = new HashMap<String,byte[]>(); | |
staticIntegers = new HashMap<String, Integer>(); | |
for (Method mMethod : (List<Method>) mClass.getMethods()) { | |
if (mMethod.getName().equals("<clinit>")) { | |
Block clinitMethodBlock = mMethod.getBody(); | |
for (int i = 0; i < clinitMethodBlock.size(); i++) { | |
if(clinitMethodBlock.get(i) instanceof Assignment){ | |
Assignment mAssignment = (Assignment) clinitMethodBlock.get(i); | |
IExpression mLeftExpression = mAssignment.getLeft(); | |
IExpression mRightExpression = mAssignment.getRight(); | |
if(mLeftExpression instanceof StaticField) { | |
StaticField mStaticField = (StaticField) mLeftExpression; | |
if (mStaticField.getField().getType().equals("[B")) { | |
byte[] b = getByteArrayValue(mRightExpression, staticIntegers, staticByteArrays); | |
if (b == null){ | |
mJebInstance.print("Incorrect static byte[] " + mStaticField.getField().getName() + " define - initDecoderValues"); | |
return; | |
} | |
staticByteArrays.put(mStaticField.getField().getName(), b); | |
if (debug) mJebInstance.print("static byte[] " + mStaticField.getField().getName()); | |
} else if (mStaticField.getField().getType().equals("I") || mStaticField.getField().getType().equals("S") || mStaticField.getField().getType().equals("B")) { | |
int a = getIntValueOfExpression(mRightExpression, staticIntegers, staticByteArrays); | |
if(a == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect int " + mStaticField.getField().getName()); | |
return; | |
} | |
staticIntegers.put(mStaticField.getField().getName(), a); | |
if (debug) mJebInstance.print("static int " + mStaticField.getField().getName() + " = " + a); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
private static void decodeMethod(Method mMethod){ | |
if (debug) mJebInstance.print("Start decode " + mMethod.getSignature()); | |
HashMap<String, Integer> intValues = new HashMap<String,Integer>(); | |
intValues.putAll(staticIntegers); | |
HashMap<String, byte[]> byteArrayValues = new HashMap<String, byte[]>(); | |
byteArrayValues.putAll(staticByteArrays); | |
for (int i = 0; i < mMethod.getBody().size(); i++){ | |
if(!mMethod.getSignature().equals(decoderMethodSignature)) decodeIElement(mMethod.getBody().get(i), mMethod.getBody(), intValues, byteArrayValues, 1); | |
} | |
} | |
public static String repeat(String str, int times){ | |
return new String(new char[times]).replace("\0", str); | |
} | |
private static void decodeIElement(IElement mIElement, IElement mParentIElement, HashMap<String, Integer> intValues, HashMap<String, byte[]> byteArrayValues, int level){ | |
if (debug) mJebInstance.print(repeat("\t", level) + "decodeIElement(" + mIElement.getClass().getName() + ", " + mParentIElement.getClass().getName() + ", ... )"); | |
if (mIElement instanceof Definition && !(mParentIElement instanceof Assignment)) { | |
Definition mDefinition = (Definition) mIElement; | |
String type = mDefinition.getType(); | |
if (type.equals("I") || type.equals("B") || type.equals("S")){ | |
intValues.put(mDefinition.getIdentifier().getName(), Integer.MIN_VALUE); | |
if (debug) mJebInstance.print("\t\tint " + mDefinition.getIdentifier().getName()); | |
} | |
} else if (mIElement instanceof Assignment){ | |
Assignment mAssignment = (Assignment) mIElement; | |
IExpression mLeftExpression = mAssignment.getLeft(); | |
IExpression mRightExpression = mAssignment.getRight(); | |
if (mAssignment.isSimpleAssignment()) { | |
if (mLeftExpression instanceof Definition) { | |
Definition mDefinition = (Definition) mLeftExpression; | |
String type = mDefinition.getType(); | |
if (type.equals("I") || type.equals("B") || type.equals("S")) { | |
int val = getIntValueOfExpression(mRightExpression, intValues, byteArrayValues); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression int " + mDefinition.getIdentifier().getName() + " == " + val + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
intValues.put(mDefinition.getIdentifier().getName(), val); | |
if (debug) | |
mJebInstance.print("\t\tint " + mDefinition.getIdentifier().getName() + " = " + val); | |
} /*else if (type.equals("[B")) { | |
byte[] val = getByteArrayValue(mRightExpression, intValues, byteArrayValues); | |
if (val == null) { | |
mJebInstance.print("Incorrect mRightExpression byte[] " + mDefinition.getIdentifier().getName() + " == " + val + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
byteArrayValues.put(mDefinition.getIdentifier().getName(), val); | |
if (debug) | |
mJebInstance.print("\t\tbyte[] " + mDefinition.getIdentifier().getName() + " = " + Arrays.toString(val)); | |
}*/ | |
} else if (mLeftExpression instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if (intValues.containsKey(mIdentifier.getName())) { | |
int val = getIntValueOfExpression(mRightExpression, intValues, byteArrayValues); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression " + mIdentifier.getName() + " == " + val + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
intValues.put(mIdentifier.getName(), val); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " = " + val); | |
} /*else if (byteArrayValues.containsKey(mIdentifier.getName())) { | |
byte[] val = getByteArrayValue(mRightExpression, intValues, byteArrayValues); | |
if (val == null) { | |
mJebInstance.print("Incorrect mRightExpression " + mIdentifier.getName() + " == " + val + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
byteArrayValues.put(mIdentifier.getName(), val); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " = " + val); | |
}*/ | |
} /*else if (mLeftExpression instanceof ArrayElt) { | |
ArrayElt mArrayElt = (ArrayElt) mLeftExpression; | |
if (mArrayElt.getArray() instanceof Identifier) { | |
String arrayName = ((Identifier) mArrayElt.getArray()).getName(); | |
if (!byteArrayValues.containsKey(arrayName)) { | |
mJebInstance.print("Unavailable byte[] " + arrayName + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
int position = getIntValueOfExpression(mArrayElt.getIndex(), intValues, byteArrayValues); | |
if (position < 0 || position >= byteArrayValues.get(arrayName).length) { | |
mJebInstance.print("Incorrect position " + position + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
byte[] result = byteArrayValues.get(arrayName); | |
int val = getIntValueOfExpression(mRightExpression, intValues, byteArrayValues); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression " + arrayName + "[" + position + "] == " + val + " for SimpleAssignment - decodeIElement"); | |
return; | |
} | |
result[position] = (byte) val; | |
if (debug) mJebInstance.print("\t\t" + arrayName + "[" + position + "] = " + val); | |
byteArrayValues.put(arrayName, result); | |
} | |
}*/ | |
} else if (mAssignment.isCombinedOperatorAssignment()) { | |
if (!(mLeftExpression instanceof Identifier)) { | |
mJebInstance.print("Incorrect left IExpression type " + mLeftExpression.getClass().getName() + " for CombinedOperatorAssignment - decodeIElement"); | |
return; | |
} | |
if (mRightExpression == null) { | |
mJebInstance.print("Incorrect right IExpression " + mRightExpression.getClass().getName() + " == null for CombinedOperatorAssignment - decodeIElement"); | |
return; | |
} | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if (intValues.containsKey(mIdentifier.getName())) { | |
int val = getIntValueOfExpression(mRightExpression, intValues, byteArrayValues); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression int value " + val + " for CombinedOperatorAssignment - decodeIElement"); | |
return; | |
} | |
Operator mOperator = mAssignment.getCombinedOperator(); | |
if(mOperator.equals(Operator.ADD)){ | |
int val2 = intValues.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " += " + val); | |
intValues.put(mIdentifier.getName(), val2 + val); | |
} else if (mOperator.equals(Operator.SUB)){ | |
int val2 = intValues.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " -= " + val); | |
intValues.put(mIdentifier.getName(), val2 - val); | |
} else if (mOperator.equals(Operator.MUL)){ | |
int val2 = intValues.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " *= " + val); | |
intValues.put(mIdentifier.getName(), val * val2); | |
} | |
} | |
} else if (mAssignment.isUnaryOperatorAssignment()) { | |
if (!(mLeftExpression instanceof Identifier)) { | |
mJebInstance.print("Incorrect left IExpretion type " + mLeftExpression.getClass().getName() + " for UnaryOperatorAssignment - decodeIElement"); | |
return; | |
} | |
if (mRightExpression != null) { | |
mJebInstance.print("Incorrect right IExpretion " + mRightExpression.getClass().getName() + " != null for UnaryOperatorAssignment - decodeIElement"); | |
return; | |
} | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if (intValues.containsKey(mIdentifier.getName())) { | |
boolean[] unaryFlags = new boolean[2]; | |
mAssignment.getUnaryOperator(unaryFlags); | |
if (unaryFlags[0]) { | |
intValues.put(mIdentifier.getName(), intValues.get(mIdentifier.getName()) + 1); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + "++"); | |
} else { | |
intValues.put(mIdentifier.getName(), intValues.get(mIdentifier.getName()) - 1); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + "--"); | |
} | |
} | |
} | |
} else if (mIElement instanceof Call) { | |
Call mCall = (Call) mIElement; | |
String methodSignature = mCall.getMethod().getSignature(); | |
if(methodSignature.equals(decoderMethodSignature) && !(mParentIElement instanceof Block)){ | |
List<IExpression> params = mCall.getArguments(); | |
int param1 = getIntValueOfExpression(params.get(0),intValues,byteArrayValues); | |
int param2 = getIntValueOfExpression(params.get(1),intValues,byteArrayValues); | |
int param3 = getIntValueOfExpression(params.get(2),intValues,byteArrayValues); | |
String result = decodeDexGuardString(param1,param2,param3); | |
mJebInstance.print("decodeDexGuardString(" + param1 + ", " + param2 + ", " + param3 + ") = " + result); | |
if(result != null) mParentIElement.replaceSubElement(mIElement, (new Constant.Builder(mJebInstance)).buildString(result)); | |
else if (debug) return; | |
} else { | |
for(int i = 0; i < mIElement.getSubElements().size(); i++){ | |
decodeIElement((IElement)mIElement.getSubElements().get(i), mIElement, intValues, byteArrayValues, level+1); | |
} | |
} | |
} | |
for (IElement element : (List<IElement>) mIElement.getSubElements()) { | |
if (!((element instanceof Class) || (element instanceof Field) || (element instanceof Method))) { | |
decodeIElement(element, mIElement, intValues, byteArrayValues, level + 1); | |
} | |
} | |
} | |
private static String decodeDexGuardString(int param1, int param2, int param3) { | |
if (debug) mJebInstance.print("decodeDexGuardString(" + param1 + ", " + param2 + ", " + param3 + ")"); | |
Method mMethod = mJebInstance.getDecompiledMethodTree(decoderMethodSignature); | |
List<Definition> params = mMethod.getParameters(); | |
Block mMethodBlock = mMethod.getBody(); | |
HashMap<String, Integer> intValuesMap = new HashMap<String, Integer>(); | |
intValuesMap.put(params.get(0).getIdentifier().getName(), param1); | |
intValuesMap.put(params.get(1).getIdentifier().getName(), param2); | |
intValuesMap.put(params.get(2).getIdentifier().getName(), param3); | |
intValuesMap.putAll(staticIntegers); | |
HashMap<String, byte[]> byteArrayValuesMap = new HashMap<String, byte[]>(); | |
byteArrayValuesMap.putAll(staticByteArrays); | |
for (int i = 0; i < mMethodBlock.size(); i++) { | |
if (debug) mJebInstance.print(mMethodBlock.get(i).getClass().getName()); | |
if(mMethodBlock.get(i) instanceof Definition){ | |
Definition mDefinition = (Definition) mMethodBlock.get(i); | |
String type = mDefinition.getType(); | |
if (type.equals("I") || type.equals("B") || type.equals("S")){ | |
intValuesMap.put(mDefinition.getIdentifier().getName(), Integer.MIN_VALUE); | |
if (debug) mJebInstance.print("\t\tint " + mDefinition.getIdentifier().getName()); | |
} else if (type.equals("[B")){ | |
byteArrayValuesMap.put(mDefinition.getIdentifier().getName(), null); | |
if (debug) mJebInstance.print("\t\tbyte[] " + mDefinition.getIdentifier().getName()); | |
} else { | |
mJebInstance.print("Unsupported Definition variable " + mDefinition.getIdentifier().getName() + " type \"" + type + "\" - decodeDexGuardString / Definition"); | |
return null; | |
} | |
} else if (mMethodBlock.get(i) instanceof Assignment){ | |
Assignment mAssignment = (Assignment) mMethodBlock.get(i); | |
IExpression mLeftExpression = mAssignment.getLeft(); | |
IExpression mRightExpression = mAssignment.getRight(); | |
if (mAssignment.isSimpleAssignment()) { | |
if (mLeftExpression instanceof Definition) { | |
Definition mDefinition = (Definition) mLeftExpression; | |
String type = mDefinition.getType(); | |
if (type.equals("I") || type.equals("B") || type.equals("S")) { | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression int " + mDefinition.getIdentifier().getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
intValuesMap.put(mDefinition.getIdentifier().getName(), val); | |
if (debug) | |
mJebInstance.print("\t\tint " + mDefinition.getIdentifier().getName() + " = " + val); | |
} else if (type.equals("[B")) { | |
byte[] val = getByteArrayValue(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == null) { | |
mJebInstance.print("Incorrect mRightExpression byte[] " + mDefinition.getIdentifier().getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
byteArrayValuesMap.put(mDefinition.getIdentifier().getName(), val); | |
if (debug) | |
mJebInstance.print("\t\tbyte[] " + mDefinition.getIdentifier().getName() + " = " + Arrays.toString(val)); | |
} else { | |
mJebInstance.print("Unsupported Definition variable " + mDefinition.getIdentifier().getName() + " type \"" + type + "\" - decodeDexGuardString / Definition"); | |
return null; | |
} | |
} else if (mLeftExpression instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if (intValuesMap.containsKey(mIdentifier.getName())) { | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression " + mIdentifier.getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
intValuesMap.put(mIdentifier.getName(), val); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " = " + val); | |
} else if (byteArrayValuesMap.containsKey(mIdentifier.getName())) { | |
byte[] val = getByteArrayValue(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == null) { | |
mJebInstance.print("Incorrect mRightExpression " + mIdentifier.getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
byteArrayValuesMap.put(mIdentifier.getName(), val); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " = " + val); | |
} else { | |
mJebInstance.print("Unknown variable " + mIdentifier.getName() + " type - decodeDexGuardString / Definition"); | |
return null; | |
} | |
} else if (mLeftExpression instanceof ArrayElt) { | |
ArrayElt mArrayElt = (ArrayElt) mLeftExpression; | |
if(mArrayElt.getArray() instanceof Identifier) { | |
String arrayName = ((Identifier)mArrayElt.getArray()).getName(); | |
if(!byteArrayValuesMap.containsKey(arrayName)){ | |
mJebInstance.print("Unavailable byte[] " + arrayName + " for SimpleAssignment - decodeDexGuardString / Assignment / ArrayElt"); | |
return null; | |
} | |
int position = getIntValueOfExpression(mArrayElt.getIndex(), intValuesMap, byteArrayValuesMap); | |
if(position < 0 || position >= byteArrayValuesMap.get(arrayName).length){ | |
mJebInstance.print("Incorrect position " + position + " for SimpleAssignment - decodeDexGuardString / Assignment / ArrayElt"); | |
return null; | |
} | |
byte[] result = byteArrayValuesMap.get(arrayName); | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression " + arrayName + "[" + position + "] == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
result[position] = (byte) val; | |
if (debug) mJebInstance.print("\t\t" + arrayName + "[" + position + "] = " + val); | |
byteArrayValuesMap.put(arrayName, result); | |
} else { | |
mJebInstance.print("Incorrect Array IExpression type " + mArrayElt.getArray().getClass().getName() + " for SimpleAssignment - decodeDexGuardString / Assignment / ArrayElt"); | |
return null; | |
} | |
} else { | |
mJebInstance.print("Incorrect left IExpression type " + mLeftExpression.getClass().getName() + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
} else if (mAssignment.isCombinedOperatorAssignment()){ | |
if(!(mLeftExpression instanceof Identifier)){ | |
mJebInstance.print("Incorrect left IExpression type " + mLeftExpression.getClass().getName() + " for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
if(mRightExpression == null){ | |
mJebInstance.print("Incorrect right IExpression " + mRightExpression.getClass().getName() + " == null for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if(!intValuesMap.containsKey(mIdentifier.getName())){ | |
mJebInstance.print("Unavailable int " + mIdentifier.getName() + " for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if(val == Integer.MIN_VALUE){ | |
mJebInstance.print("Incorrect mRightExpression int value " + val + " for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
Operator mOperator = mAssignment.getCombinedOperator(); | |
if(mOperator.equals(Operator.ADD)){ | |
int val2 = intValuesMap.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " += " + val); | |
intValuesMap.put(mIdentifier.getName(), val2 + val); | |
} else if (mOperator.equals(Operator.SUB)){ | |
int val2 = intValuesMap.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " -= " + val); | |
intValuesMap.put(mIdentifier.getName(), val2 - val); | |
} else if (mOperator.equals(Operator.MUL)){ | |
int val2 = intValuesMap.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " *= " + val); | |
intValuesMap.put(mIdentifier.getName(), val * val2); | |
} else { | |
mJebInstance.print("Unsopported combinedOperator type \"" + mOperator.toString() + "=\" for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
} else if (mAssignment.isUnaryOperatorAssignment()){ | |
if(!(mLeftExpression instanceof Identifier)){ | |
mJebInstance.print("Incorrect left IExpretion type " + mLeftExpression.getClass().getName() + " for UnaryOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
if(mRightExpression != null){ | |
mJebInstance.print("Incorrect right IExpretion " + mRightExpression.getClass().getName() + " != null for UnaryOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if(!intValuesMap.containsKey(mIdentifier.getName())){ | |
mJebInstance.print("Unavailable int " + mIdentifier.getName() + " - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
boolean[] unaryFlags = new boolean[2]; | |
mAssignment.getUnaryOperator(unaryFlags); | |
if(unaryFlags[0]){ | |
intValuesMap.put(mIdentifier.getName(), intValuesMap.get(mIdentifier.getName()) + 1); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + "++"); | |
} else { | |
intValuesMap.put(mIdentifier.getName(), intValuesMap.get(mIdentifier.getName()) - 1); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + "--"); | |
} | |
} else { | |
mJebInstance.print("Incorrect type Assignment - decodeDexGuardString"); | |
} | |
} else if (mMethodBlock.get(i) instanceof WhileStm){ | |
WhileStm mWhileStm = (WhileStm)mMethodBlock.get(i); | |
Block mWhileBlock = mWhileStm.getBody(); | |
int controller = 0; | |
while (controller < 70) { | |
controller++; | |
for (int j = 0; j < mWhileBlock.size(); j++) { | |
if (debug) mJebInstance.print("\t\t\t\t"+ mWhileBlock.get(j).getClass().getName()); | |
if(mWhileBlock.get(j) instanceof Definition){ | |
Definition mDefinition = (Definition) mWhileBlock.get(j); | |
String type = mDefinition.getType(); | |
if (type.equals("I") || type.equals("B") || type.equals("S")){ | |
intValuesMap.put(mDefinition.getIdentifier().getName(), Integer.MIN_VALUE); | |
if (debug) mJebInstance.print("\t\t\t\t\t\tint " + mDefinition.getIdentifier().getName()); | |
} else if (type.equals("[B")){ | |
byteArrayValuesMap.put(mDefinition.getIdentifier().getName(), null); | |
if (debug) mJebInstance.print("\t\t\t\t\t\tbyte[] " + mDefinition.getIdentifier().getName()); | |
} else { | |
mJebInstance.print("Unsupported Definition variable " + mDefinition.getIdentifier().getName() + " type \"" + type + "\" - decodeDexGuardString / Definition"); | |
return null; | |
} | |
} else if (mWhileBlock.get(j) instanceof Assignment){ | |
Assignment mAssignment = (Assignment) mWhileBlock.get(j); | |
IExpression mLeftExpression = mAssignment.getLeft(); | |
IExpression mRightExpression = mAssignment.getRight(); | |
if (mAssignment.isSimpleAssignment()){ | |
if(mLeftExpression instanceof Definition){ | |
Definition mDefinition = (Definition) mLeftExpression; | |
String type = mDefinition.getType(); | |
if (type.equals("I") || type.equals("B") || type.equals("S")){ | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression int " + mDefinition.getIdentifier().getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
intValuesMap.put(mDefinition.getIdentifier().getName(), val); | |
if (debug) mJebInstance.print("\t\t\t\t\t\tint " + mDefinition.getIdentifier().getName() + " = " + val); | |
} else if (type.equals("[B")){ | |
byte[] val = getByteArrayValue(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == null) { | |
mJebInstance.print("Incorrect mRightExpression byte[] " + mDefinition.getIdentifier().getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
byteArrayValuesMap.put(mDefinition.getIdentifier().getName(), val); | |
if (debug) mJebInstance.print("\t\t\t\t\t\tbyte[] " + mDefinition.getIdentifier().getName() + " = " + Arrays.toString(val)); | |
} else { | |
mJebInstance.print("Unsupported Definition variable " + mDefinition.getIdentifier().getName() + " type \"" + type + "\" - decodeDexGuardString / Definition"); | |
return null; | |
} | |
} else if (mLeftExpression instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if (intValuesMap.containsKey(mIdentifier.getName())){ | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression " + mIdentifier.getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
intValuesMap.put(mIdentifier.getName(), val); | |
if (debug) mJebInstance.print("\t\t\t\t\t\t" + mIdentifier.getName() + " = " + val); | |
} else if (byteArrayValuesMap.containsKey(mIdentifier.getName())){ | |
byte[] val = getByteArrayValue(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == null) { | |
mJebInstance.print("Incorrect mRightExpression " + mIdentifier.getName() + " == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
byteArrayValuesMap.put(mIdentifier.getName(), val); | |
if (debug) mJebInstance.print("\t\t\t\t\t\t" + mIdentifier.getName() + " = " + val); | |
} else { | |
mJebInstance.print("Unknown variable " + mIdentifier.getName() + " type - decodeDexGuardString / Definition"); | |
return null; | |
} | |
} else if (mLeftExpression instanceof ArrayElt) { | |
ArrayElt mArrayElt = (ArrayElt) mLeftExpression; | |
if(mArrayElt.getArray() instanceof Identifier) { | |
String arrayName = ((Identifier)mArrayElt.getArray()).getName(); | |
if(!byteArrayValuesMap.containsKey(arrayName)){ | |
mJebInstance.print("Unavailable byte[] " + arrayName + " for SimpleAssignment - decodeDexGuardString / Assignment / ArrayElt"); | |
return null; | |
} | |
int position = getIntValueOfExpression(mArrayElt.getIndex(), intValuesMap, byteArrayValuesMap); | |
if(position < 0 || position >= byteArrayValuesMap.get(arrayName).length){ | |
mJebInstance.print("Incorrect position " + position + " for SimpleAssignment - decodeDexGuardString / Assignment / ArrayElt"); | |
return null; | |
} | |
byte[] result = byteArrayValuesMap.get(arrayName); | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if (val == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect mRightExpression " + arrayName + "[" + position + "] == " + val + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
result[position] = (byte) val; | |
if (debug) mJebInstance.print("\t\t" + arrayName + "[" + position + "] = " + val); | |
byteArrayValuesMap.put(arrayName, result); | |
} else { | |
mJebInstance.print("Incorrect Array IExpression type " + mArrayElt.getArray().getClass().getName() + " for SimpleAssignment - decodeDexGuardString / Assignment / ArrayElt"); | |
return null; | |
} | |
} else { | |
mJebInstance.print("Incorrect left IExpression type " + mLeftExpression.getClass().getName() + " for SimpleAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
} else if (mAssignment.isCombinedOperatorAssignment()){ | |
if(!(mLeftExpression instanceof Identifier)){ | |
mJebInstance.print("Incorrect left IExpression type " + mLeftExpression.getClass().getName() + " for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
if(mRightExpression == null){ | |
mJebInstance.print("Incorrect right IExpression " + mRightExpression.getClass().getName() + " == null for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if(!intValuesMap.containsKey(mIdentifier.getName())){ | |
mJebInstance.print("Unavailable int " + mIdentifier.getName() + " for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
int val = getIntValueOfExpression(mRightExpression, intValuesMap, byteArrayValuesMap); | |
if(val == Integer.MIN_VALUE){ | |
mJebInstance.print("Incorrect mRightExpression int value " + val + " for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
Operator mOperator = mAssignment.getCombinedOperator(); | |
if(mOperator.equals(Operator.ADD)){ | |
int val2 = intValuesMap.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " += " + val); | |
intValuesMap.put(mIdentifier.getName(), val2 + val); | |
} else if (mOperator.equals(Operator.SUB)){ | |
int val2 = intValuesMap.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " -= " + val); | |
intValuesMap.put(mIdentifier.getName(), val2 - val); | |
} else if (mOperator.equals(Operator.MUL)){ | |
int val2 = intValuesMap.get(mIdentifier.getName()); | |
if (debug) mJebInstance.print("\t\t" + mIdentifier.getName() + " *= " + val); | |
intValuesMap.put(mIdentifier.getName(), val * val2); | |
} else { | |
mJebInstance.print("Unsopported combinedOperator type \"" + mOperator.toString() + "=\" for CombinedOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
} else if (mAssignment.isUnaryOperatorAssignment()){ | |
if(!(mLeftExpression instanceof Identifier)){ | |
mJebInstance.print("Incorrect left IExpretion type " + mLeftExpression.getClass().getName() + " for UnaryOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
if(mRightExpression != null){ | |
mJebInstance.print("Incorrect right IExpretion " + mRightExpression.getClass().getName() + " != null for UnaryOperatorAssignment - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
Identifier mIdentifier = (Identifier) mLeftExpression; | |
if(!intValuesMap.containsKey(mIdentifier.getName())){ | |
mJebInstance.print("Unavailable int " + mIdentifier.getName() + " - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
boolean[] unaryFlags = new boolean[2]; | |
mAssignment.getUnaryOperator(unaryFlags); | |
if(unaryFlags[0]){ | |
intValuesMap.put(mIdentifier.getName(), intValuesMap.get(mIdentifier.getName()) + 1); | |
if (debug) mJebInstance.print("\t\t\t\t\t\t" + mIdentifier.getName() + "++"); | |
} else { | |
intValuesMap.put(mIdentifier.getName(), intValuesMap.get(mIdentifier.getName()) - 1); | |
if (debug) mJebInstance.print("\t\t\t\t\t\t" + mIdentifier.getName() + "--"); | |
} | |
} else { | |
mJebInstance.print("Incorrect type Assignment - decodeDexGuardString"); | |
} | |
} else if (mWhileBlock.get(j) instanceof IfStm){ | |
IfStm mIfStm = (IfStm) mWhileBlock.get(j); | |
Predicate mPredicate = mIfStm.getBranchPredicate(0); | |
String lVarName = ((Identifier) mPredicate.getLeft()).getName(); | |
String rVarName = ((Identifier) mPredicate.getRight()).getName(); | |
Block ifBlock = mIfStm.getBranchBody(0); | |
if(intValuesMap.get(lVarName).equals(intValuesMap.get(rVarName))){ | |
String resultByteArray = ""; | |
for (int k = 0; k < ifBlock.size(); k++) { | |
if(ifBlock.get(k) instanceof Return){ | |
Return mReturn = (Return) ifBlock.get(k); | |
if(mReturn.getExpression() instanceof New){ | |
New mNew = (New) mReturn.getExpression(); | |
List args = mNew.getArguments(); | |
if (args.size() > 0 && args.get(0) instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) args.get(0); | |
resultByteArray = mIdentifier.getName(); | |
} else { | |
mJebInstance.print("String init params incorrect"); | |
return null; | |
} | |
} else if (mReturn.getExpression() instanceof Call) { | |
Call mCall = (Call) mReturn.getExpression(); | |
List<IExpression> par = mCall.getArguments(); | |
if(par.size() <= 0) { | |
mJebInstance.print("Unavailable String Creater"); | |
return null; | |
} | |
if (par.get(0) instanceof New) { | |
New mNew = (New) par.get(0); | |
List args = mNew.getArguments(); | |
if (args.size() > 0 && args.get(0) instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) args.get(0); | |
resultByteArray = mIdentifier.getName(); | |
} else { | |
mJebInstance.print("String init params incorrect"); | |
return null; | |
} | |
} else { | |
mJebInstance.print("Unavailable String Creater in Call"); | |
return null; | |
} | |
} else { | |
mJebInstance.print("Incorrect Return Expression " + mReturn.getExpression().getClass().getName()); | |
return null; | |
} | |
} else { | |
mJebInstance.print("Statement is not Return (" + ifBlock.get(k).getClass().getName() + ")"); | |
return null; | |
} | |
} | |
//mJebInstance.print("t4 - " + resultByteArray + " = " + Arrays.toString(byteArrayValuesMap.get(resultByteArray)) + " " + new String(byteArrayValuesMap.get(resultByteArray))); | |
return new String(byteArrayValuesMap.get(resultByteArray)); | |
} | |
} else { | |
mJebInstance.print("Unsupported Statement type " + mWhileBlock.get(j).getClass().getName() + " - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
} | |
} | |
} else { | |
mJebInstance.print("Unsupported Statement type " + mMethodBlock.get(i).getClass().getName() + " - decodeDexGuardString / Assignment"); | |
return null; | |
} | |
} | |
return ""; | |
} | |
private static byte[] getByteArrayValue(IExpression mIExpression, HashMap<String,Integer> intValues, HashMap<String, byte[]> byteArrayValues){ | |
if (debug) mJebInstance.print("\t\t\t\t\t\t\t\tgetByteArrayValue for " + mIExpression.getClass().getName()); | |
if (mIExpression instanceof Call) { | |
//TODO | |
mJebInstance.print("Unsupported IExpression parametr type - getByteArrayValue of Call"); | |
return null; | |
} else if (mIExpression instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) mIExpression; | |
if(!byteArrayValues.containsKey(mIdentifier.getName())) { | |
mJebInstance.print("Unavailable byte[] " + mIdentifier.getName() + " - getByteArrayValue of Identifier"); | |
return null; | |
} | |
return byteArrayValues.get(mIdentifier.getName()); | |
} else if (mIExpression instanceof InstanceField) { | |
//TODO | |
mJebInstance.print("Unsupported IExpression parametr type - getByteArrayValue of InstanceField"); | |
return null; | |
} else if (mIExpression instanceof NewArray) { | |
NewArray mNewArray = (NewArray) mIExpression; | |
if(!mNewArray.getType().equals("[B")){ | |
mJebInstance.print("Unsupported NewArray type " + mNewArray.getType() + " - getByteArrayValue of NewArray"); | |
return null; | |
} | |
if(mNewArray.getInitialValues() != null){ | |
List<Constant> initialValues = mNewArray.getInitialValues(); | |
if(initialValues.isEmpty()){ | |
return null; | |
} | |
byte[] rezult = new byte[initialValues.size()]; | |
for (int i = 0; i < initialValues.size(); i++) { | |
rezult[i] = initialValues.get(i).getByte(); | |
} | |
return rezult; | |
} else if (mNewArray.getSizes() != null) { | |
if (mNewArray.getSizes().size() > 1) { | |
mJebInstance.print("Unsupported NewArray multiSizes array " + mNewArray.getSizes().size() + " - getByteArrayValue of NewArray"); | |
return null; | |
} | |
IExpression mSizeIExpression = (IExpression) mNewArray.getSizes().get(0); | |
int sizeArray = getIntValueOfExpression(mSizeIExpression, intValues, byteArrayValues); | |
if (sizeArray < 0) { | |
mJebInstance.print("Incorrect array size " + sizeArray + " - getByteArrayValue of NewArray"); | |
return null; | |
} | |
return new byte[sizeArray]; | |
} else { | |
mJebInstance.print("Error - getByteArrayValue of NewArray"); | |
return null; | |
} | |
} else if (mIExpression instanceof StaticField) { | |
StaticField mStaticField = (StaticField) mIExpression; | |
String fType = mStaticField.getField().getType(); | |
if(!fType.equals("[B")){ | |
mJebInstance.print("Incorrect StaticField type " + fType + " - getByteArrayValue of StaticField"); | |
return null; | |
} | |
if(!byteArrayValues.containsKey(mStaticField.getField().getName())){ | |
mJebInstance.print("Unavailable byte[] " + mStaticField.getField().getName() + " - getByteArrayValue of StaticField"); | |
return null; | |
} | |
return byteArrayValues.get(mStaticField.getField().getName()); | |
} else { | |
mJebInstance.print("Unsupported IExpression parametr type - getByteArrayValue of " + mIExpression.getClass().getName()); | |
return null; | |
} | |
} | |
private static int getIntValueOfExpression(IExpression mIExpression, HashMap<String, Integer> intValues, HashMap<String,byte[]> byteArrayValues) { | |
if (debug) mJebInstance.print("\t\t\t\t\t\t\t\tgetIntValueOfExpression for " + mIExpression.getClass().getName()); | |
if(mIExpression instanceof ArrayElt){ | |
ArrayElt mArrayElt = (ArrayElt) mIExpression; | |
if(!(mArrayElt.getArray() instanceof Identifier || mArrayElt.getArray() instanceof StaticField)){ | |
mJebInstance.print("Unsupported type of Array " + mArrayElt.getArray().getClass().getName() + " - getIntValueOfExpression of ArrayElt"); | |
return Integer.MIN_VALUE; | |
} | |
String byteArrayName = (mArrayElt.getArray() instanceof Identifier) ? ((Identifier)mArrayElt.getArray()).getName() : ((StaticField)mArrayElt.getArray()).getField().getName(); | |
if(!byteArrayValues.containsKey(byteArrayName)){ | |
mJebInstance.print("Unavailable byteArray " + byteArrayName + " - getIntValueOfExpression of ArrayElt"); | |
return Integer.MIN_VALUE; | |
} | |
byte[] mBytes = byteArrayValues.get(byteArrayName); | |
int position = getIntValueOfExpression(mArrayElt.getIndex(), intValues, byteArrayValues); | |
if(mBytes.length <= position){ | |
mJebInstance.print("Incorrect position (byte[].length " + mBytes.length + " <= position " + position + ") - getIntValueOfExpression of ArrayElt"); | |
return Integer.MIN_VALUE; | |
} else if (position < 0){ | |
mJebInstance.print("Incorrect position (position " + position + " < 0) - getIntValueOfExpression of ArrayElt"); | |
return Integer.MIN_VALUE; | |
} | |
return mBytes[position]; | |
} else if (mIExpression instanceof Call) { | |
//TODO | |
mJebInstance.print("Unsupported IExpression parametr type - getIntValueOfExpression of Call"); | |
return Integer.MIN_VALUE; | |
} else if (mIExpression instanceof Constant) { | |
Constant mConstant = (Constant) mIExpression; | |
if(mConstant.isFalse() || mConstant.isNull() || mConstant.isTrue() || mConstant.isString()){ | |
mJebInstance.print("Unsupported type of Constant - getIntValueOfExpression of Constant"); | |
return Integer.MIN_VALUE; | |
} | |
String type = ((Constant) mIExpression).getType(); | |
if(type.equals("B")){ | |
return (int) ((Constant) mIExpression).getByte(); | |
} else if (type.equals("S")){ | |
return (int) ((Constant) mIExpression).getShort(); | |
} else { | |
return ((Constant) mIExpression).getInt(); | |
} | |
} else if (mIExpression instanceof Expression) { | |
Expression mExpression = (Expression) mIExpression; | |
int lValue = Integer.MIN_VALUE; | |
if(mExpression.getLeft() != null) { | |
lValue = getIntValueOfExpression(mExpression.getLeft(), intValues, byteArrayValues); | |
if (lValue == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect lValue " + lValue + " - getIntValueOfExpression of Expression"); | |
return Integer.MIN_VALUE; | |
} | |
} | |
int rValue = getIntValueOfExpression(mExpression.getRight(), intValues, byteArrayValues); | |
if (rValue == Integer.MIN_VALUE) { | |
mJebInstance.print("Incorrect rValue " + rValue + " - getIntValueOfExpression of Expression"); | |
return Integer.MIN_VALUE; | |
} | |
Operator mOperator = mExpression.getOperator(); | |
if(mOperator.equals(Operator.ADD)){ | |
return lValue + rValue; | |
} else if (mOperator.equals(Operator.SUB)){ | |
return lValue - rValue; | |
} else if (mOperator.equals(Operator.MUL)){ | |
return lValue * rValue; | |
} else if (mOperator.equals(Operator.DIV)){ | |
return lValue / rValue; | |
} else if (mOperator.equals(Operator.REM)){ | |
return lValue % rValue; | |
} else if (mOperator.equals(Operator.OR)){ | |
return lValue | rValue; | |
} else if (mOperator.equals(Operator.AND)){ | |
return lValue & rValue; | |
} else if (mOperator.equals(Operator.XOR)){ | |
return lValue ^ rValue; | |
} else if (mOperator.equals(Operator.SHL)){ | |
return lValue << rValue; | |
} else if (mOperator.equals(Operator.SHR)){ | |
return lValue >> rValue; | |
} else if (mOperator.equals(Operator.USHR)){ | |
return lValue >>> rValue; | |
} else if (mOperator.equals(Operator.NEG)) { | |
return -rValue; | |
} else if (mOperator.equals(Operator.CAST_TO_BYTE)) { | |
return rValue; | |
} else if (mOperator.equals(Operator.CAST_TO_SHORT)) { | |
return rValue; | |
} else if (mOperator.equals(Operator.CAST_TO_INT)) { | |
return rValue; | |
} else { | |
mJebInstance.print("Unsupported operation type \"" + mOperator.toString() + "\" - getIntValueOfExpression of Expression"); | |
return Integer.MIN_VALUE; | |
} | |
} else if (mIExpression instanceof Identifier) { | |
Identifier mIdentifier = (Identifier) mIExpression; | |
if(!intValues.containsKey(mIdentifier.getName())){ | |
mJebInstance.print("intValues.keys = " + Arrays.toString(intValues.keySet().toArray())); | |
mJebInstance.print("Unavailable int " + mIdentifier.getName() + " - getIntValueOfExpression of Identifier"); | |
return Integer.MIN_VALUE; | |
} | |
return intValues.get(mIdentifier.getName()); | |
} else if (mIExpression instanceof InstanceField) { | |
//TODO | |
mJebInstance.print("Unsupported IExpression parametr type - getIntValueOfExpression of InstanceField"); | |
return Integer.MIN_VALUE; | |
} else if (mIExpression instanceof StaticField) { | |
StaticField mStaticField = (StaticField) mIExpression; | |
String fType = mStaticField.getField().getType(); | |
if(!(fType.equals("I") || fType.equals("B") || fType.equals("S") )){ | |
mJebInstance.print("Incorrect StaticField type " + fType + " - getIntValueOfExpression of StaticField"); | |
return Integer.MIN_VALUE; | |
} | |
if(!intValues.containsKey(mStaticField.getField().getName())){ | |
mJebInstance.print("Unavailable int " + mStaticField.getField().getName() + " - getIntValueOfExpression of StaticField"); | |
return Integer.MIN_VALUE; | |
} | |
return intValues.get(mStaticField.getField().getName()); | |
} else { | |
mJebInstance.print("Unsupported IExpression parametr type - getIntValueOfExpression of " + mIExpression.getClass().getName()); | |
return Integer.MIN_VALUE; | |
} | |
} | |
private static String getClassFromSignature(String signature){ | |
String pattern = "^(L[a-zA-Z/$]*[;])(.*)$"; | |
return signature.replaceAll(pattern, "$1"); | |
} | |
} |
ahh ok can you write an md5 for example?
one more
DexGuardDecoder_Start
Error executing script:
java.lang.NullPointerException
DexGuardDecoder.run(DexGuardDecoder.java:47)
This is the file https://www.virustotal.com/en/file/c655e01b40b7bc5e9c88429360828c046549ac07d7ba6d591b7bdda92597bafd/analysis/
The same error (47) for this sample:
https://www.virustotal.com/en/file/c655e01b40b7bc5e9c88429360828c046549ac07d7ba6d591b7bdda92597bafd/analysis/
Can you send me apk?
DexGuardDecoder.java:304: error: cannot find symbol
} else if (mAssignment.isCombinedOperatorAssignment()) {
:(
Is it compatible with JEB 2.xx plugins API ?
Can we download these APKs? Or could you upload them somewhere?
The script does work with some versions of DexGuard.
Do they work with DexProtector ?
idanr1986, it means that the script did not find the decryption method. Сan You send me the apk, that are you trying to decipher?