package mobi.acpm.inspeckage.util;
import com.google.gson.Gson;
import java.util.List;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XSharedPreferences;
/**
* Created by acpm on 30/10/16.
*/
public class Replacement {
private static Gson gson = new Gson();
public static final String TAG = "Inspeckage_Replacement:";
public static boolean parameterReplace(XC_MethodHook.MethodHookParam param, XSharedPreferences sPrefs) {
String user_json = sPrefs.getString(Config.SP_USER_REPLACES, "");
if (!user_json.trim().equals("")) {
String json = "{\"replaceParamItems\": " + sPrefs.getString(Config.SP_USER_REPLACES, "") + "}";
ReplaceParamList replaceList = gson.fromJson(json, ReplaceParamList.class);
for (ReplaceParamItem item : replaceList.replaceParamItems) {
if (item.position > 0 && item.state) {
if (item.classMethod.equalsIgnoreCase(param.method.getDeclaringClass().getName() + "." + param.method.getName())) {
int p = item.position - 1;
if (param.args[p] != null) {
if (item.paramType.equals("boolean")) {
if (param.args[p] instanceof Boolean) {
param.args[p] = Boolean.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("String") && param.args[p] instanceof String) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (item.paramMatch.equals(param.args[p])) {
param.args[p] = item.paramNewValue;
}
} else {
param.args[p] = item.paramNewValue;
}
} else if (item.paramType.equals("int") && param.args[p] instanceof Integer) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Integer.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Integer.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Integer.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("ByteArray") && param.args[p].getClass().equals(byte[].class)) {
String v = Util.byteArrayToString((byte[]) param.args[p]);
if (item.paramMatch != null && !item.paramMatch.toString().trim().equals("")) {
if (v.equals(item.paramMatch.toString())) {
param.args[p] = v.getBytes();
}
} else {
param.args[p] = item.paramNewValue.toString().getBytes();
}
} else if (item.paramType.equals("short") && param.args[p] instanceof Short) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Short.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Short.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Short.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("long") && param.args[p] instanceof Long) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Long.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Long.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Long.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("float") && param.args[p] instanceof Float) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Float.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Float.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Float.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("double") && param.args[p] instanceof Double) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Double.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Double.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Double.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("charArray") && param.args[p] instanceof char[]) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (item.paramMatch.toString().toCharArray().equals(param.args[p])) {
param.args[p] = item.paramNewValue.toString().toCharArray();
}
} else {
param.args[p] = item.paramNewValue.toString().toCharArray();
}
}
}
//construtor
} else if (item.classMethod.equalsIgnoreCase(param.method.getDeclaringClass().getName() + "." + param.method.getDeclaringClass().getSimpleName())) {
int p = item.position - 1;
if (param.args[p] != null) {
if (item.paramType.equals("boolean")) {
if (param.args[p] instanceof Boolean) {
param.args[p] = Boolean.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("String") && param.args[p] instanceof String) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (item.paramMatch.equals(param.args[p])) {
param.args[p] = item.paramNewValue;
}
} else {
param.args[p] = item.paramNewValue;
}
} else if (item.paramType.equals("int") && param.args[p] instanceof Integer) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Integer.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Integer.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Integer.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("ByteArray") && param.args[p].getClass().equals(byte[].class)) {
String v = Util.byteArrayToString((byte[]) param.args[p]);
if (item.paramMatch != null && !item.paramMatch.toString().trim().equals("")) {
if (v.equals(item.paramMatch.toString())) {
param.args[p] = v.getBytes();
}
} else {
param.args[p] = item.paramNewValue.toString().getBytes();
}
} else if (item.paramType.equals("short") && param.args[p] instanceof Short) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Short.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Short.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Short.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("long") && param.args[p] instanceof Long) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Long.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Long.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Long.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("float") && param.args[p] instanceof Float) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Float.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Float.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Float.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("double") && param.args[p] instanceof Double) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (Double.valueOf(item.paramMatch.toString()).equals(param.args[p])) {
param.args[p] = Double.valueOf(item.paramNewValue.toString());
}
} else {
param.args[p] = Double.valueOf(item.paramNewValue.toString());
}
} else if (item.paramType.equals("charArray") && param.args[p] instanceof char[]) {
if (item.paramMatch != null && item.paramMatch.toString().trim() != "") {
if (item.paramMatch.toString().toCharArray().equals(param.args[p])) {
param.args[p] = item.paramNewValue.toString().toCharArray();
}
} else {
param.args[p] = item.paramNewValue.toString().toCharArray();
}
}
}
}
}
}
}
return true;
}
public static boolean resultReplace(XC_MethodHook.MethodHookParam param, XSharedPreferences sPrefs) {
String user_json = sPrefs.getString(Config.SP_USER_RETURN_REPLACES, "");
if (!user_json.trim().equals("")) {
String json = "{\"replaceReturnItems\": " + sPrefs.getString(Config.SP_USER_RETURN_REPLACES, "") + "}";
ReplaceReturnList replaceList = gson.fromJson(json, ReplaceReturnList.class);
for (ReplaceReturnItem item : replaceList.replaceReturnItems) {
if (item.state && item.classMethod.equalsIgnoreCase(param.method.getDeclaringClass().getName() + "." + param.method.getName())) {
if (item.returnNewValue != null && !item.returnNewValue.equals("void")) {
if (item.returnType.equals("boolean") && param.getResult() instanceof Boolean) {
param.setResult(Boolean.valueOf(item.returnNewValue.toString()));
} else if (item.returnType.equals("String") && param.getResult() instanceof String) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (item.returnMatch.equals(param.getResult())) {
param.setResult(item.returnNewValue);
}
} else {
param.setResult(item.returnNewValue);
}
} else if (item.returnType.equals("int") && param.getResult() instanceof Integer) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (Integer.valueOf(item.returnNewValue.toString()).equals(param.getResult())) {
param.setResult(Integer.valueOf(item.returnNewValue.toString()));
}
} else {
param.setResult(Integer.valueOf(item.returnNewValue.toString()));
}
} else if (item.returnType.equals("ByteArray") && param.getResult().getClass().equals(byte[].class)) {
String v = Util.byteArrayToString((byte[]) param.getResult());
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
param.setResult(v.getBytes());
} else {
param.setResult(item.returnNewValue.toString().getBytes());
}
} else if (item.returnType.equals("short") && param.getResult() instanceof Short) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (Short.valueOf(item.returnNewValue.toString()).equals(param.getResult())) {
param.setResult(Short.valueOf(item.returnNewValue.toString()));
}
} else {
param.setResult(Short.valueOf(item.returnNewValue.toString()));
}
} else if (item.returnType.equals("long") && param.getResult() instanceof Long) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (Long.valueOf(item.returnNewValue.toString()).equals(param.getResult())) {
param.setResult(Long.valueOf(item.returnNewValue.toString()));
}
} else {
param.setResult(Long.valueOf(item.returnNewValue.toString()));
}
} else if (item.returnType.equals("float") && param.getResult() instanceof Float) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (Float.valueOf(item.returnNewValue.toString()).equals(param.getResult())) {
param.setResult(Float.valueOf(item.returnNewValue.toString()));
}
} else {
param.setResult(Float.valueOf(item.returnNewValue.toString()));
}
} else if (item.returnType.equals("double") && param.getResult() instanceof Double) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (Double.valueOf(item.returnNewValue.toString()).equals(param.getResult())) {
param.setResult(Double.valueOf(item.returnNewValue.toString()));
}
} else {
param.setResult(Double.valueOf(item.returnNewValue.toString()));
}
} else if (item.returnType.equals("charArray") && param.getResult() instanceof char[]) {
if (item.returnMatch != null && item.returnMatch.toString().trim() != "") {
if (item.returnNewValue.toString().toCharArray().equals(param.getResult())) {
param.setResult(item.returnNewValue.toString().toCharArray());
}
} else {
param.setResult(item.returnNewValue.toString().toCharArray());
}
}
}
}
}
}
return true;
}
}
class ReplaceParamItem{
protected int id;
protected String classMethod;
protected int position;
protected String paramType;
protected Object paramMatch;
protected Object paramNewValue;
protected boolean state;
}
class ReplaceParamList{
protected List<ReplaceParamItem> replaceParamItems;
}
class ReplaceReturnItem{
protected int id;
protected String classMethod;
protected Object returnType;
protected Object returnNewValue;
protected Object returnMatch;
protected boolean state;
}
class ReplaceReturnList{
protected List<ReplaceReturnItem> replaceReturnItems;
}