package mobi.acpm.inspeckage;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import mobi.acpm.inspeckage.hooks.BuildHook;
import mobi.acpm.inspeckage.hooks.ClipboardHook;
import mobi.acpm.inspeckage.hooks.CryptoHook;
import mobi.acpm.inspeckage.hooks.FileSystemHook;
import mobi.acpm.inspeckage.hooks.FlagSecureHook;
import mobi.acpm.inspeckage.hooks.HashHook;
import mobi.acpm.inspeckage.hooks.HttpHook;
import mobi.acpm.inspeckage.hooks.IPCHook;
import mobi.acpm.inspeckage.hooks.MiscHook;
import mobi.acpm.inspeckage.hooks.ProxyHook;
import mobi.acpm.inspeckage.hooks.SQLiteHook;
import mobi.acpm.inspeckage.hooks.SSLPinningHook;
import mobi.acpm.inspeckage.hooks.SerializationHook;
import mobi.acpm.inspeckage.hooks.SharedPrefsHook;
import mobi.acpm.inspeckage.hooks.UIHook;
import mobi.acpm.inspeckage.hooks.UserHooks;
import mobi.acpm.inspeckage.hooks.WebViewHook;
import mobi.acpm.inspeckage.util.Config;
import mobi.acpm.inspeckage.util.DexUtil;
import mobi.acpm.inspeckage.util.FileType;
import mobi.acpm.inspeckage.util.FileUtil;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
/**
* Created by acpm on 16/11/15.
*/
public class Module extends XC_MethodHook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
public static final String PREFS = "InspeckagePrefs";
public static final String TAG = "Inspeckage_Module:";
public static final String ERROR = "Inspeckage_Error";
public static XSharedPreferences sPrefs;
public static final String MY_PACKAGE_NAME = Module.class.getPackage().getName();
public void initZygote(StartupParam startupParam) throws Throwable {
sPrefs = new XSharedPreferences(MY_PACKAGE_NAME, PREFS);
sPrefs.makeWorldReadable();
}
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
sPrefs.reload();
//estes hooks tem que ocorrer na inicializaĆ§Ć£o
//ProcessHook.initAllHooks(loadPackageParam);
//check if this module is enable
if (loadPackageParam.packageName.equals("mobi.acpm.inspeckage")) {
findAndHookMethod("mobi.acpm.inspeckage.webserver.WebServer", loadPackageParam.classLoader, "isModuleEnabled", XC_MethodReplacement.returnConstant(true));
}
if (loadPackageParam.packageName.equals("mobi.acpm.inspeckage"))
return;
if (!loadPackageParam.packageName.equals(sPrefs.getString("package", "")))
return;
findAndHookMethod("android.util.Log", loadPackageParam.classLoader, "i",
String.class, String.class, new XC_MethodHook() {
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (param.args[0] == "Xposed") {
String log = (String) param.args[1];
FileType ft = null;
if (log.contains(SharedPrefsHook.TAG)) { //5
ft = FileType.PREFS;
} else if (log.contains(CryptoHook.TAG)) { //2
ft = FileType.CRYPTO;
} else if (log.contains(HashHook.TAG)) { //3
ft = FileType.HASH;
} else if (log.contains(SQLiteHook.TAG)) { //6
ft = FileType.SQLITE;
} else if (log.contains(ClipboardHook.TAG)) { //1
ft = FileType.CLIPB;
} else if (log.contains(IPCHook.TAG)) { //4
ft = FileType.IPC;
} else if (log.contains(WebViewHook.TAG)) { //8
ft = FileType.WEBVIEW;
} else if (log.contains(FileSystemHook.TAG)) { //9
ft = FileType.FILESYSTEM;
} else if (log.contains(MiscHook.TAG)) { //10
ft = FileType.MISC;
} else if (log.contains(SerializationHook.TAG)) { //10
ft = FileType.SERIALIZATION;
} else if (log.contains(HttpHook.TAG)) { //10
ft = FileType.HTTP;
} else if (log.contains(UserHooks.TAG)) { //10
ft = FileType.USERHOOKS;
}
if (ft != null) {
FileUtil.writeToFile(sPrefs, log, ft, "");
}
}
}
});
UIHook.initAllHooks(loadPackageParam);
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_HTTP,true)) {
HttpHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_MISC,true)) {
MiscHook.initAllHooks(loadPackageParam);
ClipboardHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_WV,true)) {
WebViewHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_CRYPTO,true)) {
CryptoHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_FS,true)) {
FileSystemHook.initAllHooks(loadPackageParam);
}
FlagSecureHook.initAllHooks(loadPackageParam);
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_HASH,true)) {
HashHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_IPC,true)) {
IPCHook.initAllHooks(loadPackageParam);
}
ProxyHook.initAllHooks(loadPackageParam);// --
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_SHAREDP,true)) {
SharedPrefsHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_SQLITE,true)) {
SQLiteHook.initAllHooks(loadPackageParam);
}
SSLPinningHook.initAllHooks(loadPackageParam);// --
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_SERIALIZATION,true)) {
SerializationHook.initAllHooks(loadPackageParam);
}
if(sPrefs.getBoolean(Config.SP_TAB_ENABLE_PHOOKS,true)) {
UserHooks.initAllHooks(loadPackageParam);
}
BuildHook.initAllHooks(loadPackageParam);
DexUtil.saveClassesWithMethodsJson(loadPackageParam, sPrefs);
}
public static void logError(Error e){
XposedBridge.log(Module.ERROR + " " + e.getMessage());
}
}