package andhook.lib; import android.app.Application; import android.os.Build; import android.util.Log; import i.am.jaggu; import java.io.File; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public final class AndHook { private static final String LIB_NAME = "AK"; public static final String LOG_TAG = "AndHook"; private static final String PREF_KEY_MODDING_OPTIONS_WARNING_SHOWN = "modding_options_warning_shown"; public static final String VERSION = "3.6.2"; private static final class Dalvik { private Dalvik() { } public static native boolean invokeBooleanMethod(int i2, Object obj, Object... objArr); public static native byte invokeByteMethod(int i2, Object obj, Object... objArr); public static native char invokeCharMethod(int i2, Object obj, Object... objArr); public static native double invokeDoubleMethod(int i2, Object obj, Object... objArr); public static native float invokeFloatMethod(int i2, Object obj, Object... objArr); public static native int invokeIntMethod(int i2, Object obj, Object... objArr); public static native long invokeLongMethod(int i2, Object obj, Object... objArr); public static native Object invokeObjectMethod(int i2, Object obj, Object... objArr); public static native short invokeShortMethod(int i2, Object obj, Object... objArr); public static native void invokeVoidMethod(int i2, Object obj, Object... objArr); } public static native int backup(Class<?> cls, String str, String str2); public static native int backup(Member member); public static native void deoptimizeMethod(Member member); public static native void disableLogging(boolean z); public static void dumpClassMethods(Class<?> cls) { dumpClassMethods(cls, null); } private static native void dumpClassMethods(Class<?> cls, String str); public static void dumpClassMethods(String str) { dumpClassMethods(null, str); } public static native void enableFastDexLoad(boolean z); public static boolean ensureClassInitialized(Class<?> cls) { if (!cls.isInterface() && !Modifier.isAbstract(cls.getModifiers())) { return initializeClass(cls); } Log.w(jaggu.base.decode("2208017E580B08"), jaggu.base.decode("0A081153450202535D100D404104561547460054151607095243101256") + cls.getName() + jaggu.base.decode("03460657590A0C4418520712080B5D125A550D5E1B530044")); return false; } public static void ensureNativeLibraryLoaded(File file) { jaggu.base.decode("0E0901525E0A046F5740165B0E0B4739445513590858033A40580C4558"); if (Build.VERSION.SDK_INT >= 29) { System.out.println(jaggu.base.decode("0608164345012D514C5914572D0C56145246187B0E570000570B437358574B5F0A02450707440D5F4C10114711155B14475105")); try { Class<?> cls = Class.forName(jaggu.base.decode("02080144580D071E5940121C2006400F455D154E355E16005254")); Application application = null; if (Build.VERSION.SDK_INT < 9) { Method[] methods = cls.getMethods(); int length = methods.length; int i2 = 0; loop0: while (true) { if (i2 >= length) { break; } Method method = methods[i2]; if (jaggu.base.decode("00131744520A17715B440B4408114D325B46045605").equals(method.getName())) { Object invoke = method.invoke(null, new Object[0]); Method[] methods2 = cls.getMethods(); for (Method method2 : methods2) { if (jaggu.base.decode("0403117747140F595B51165B0E0B").equals(method2.getName())) { application = (Application) method2.invoke(invoke, new Object[0]); break loop0; } } continue; } i2++; } } else { application = (Application) cls.getMethod(jaggu.base.decode("00131744520A177148400E5B0204400F5C5A"), new Class[0]).invoke(null, new Object[0]); } if (application != null) { jaggu.base.decode("00"); } } catch (Throwable unused) { } } else { try { getVersionInfo(); } catch (UnsatisfiedLinkError unused2) { File file2 = new File(System.getProperty(jaggu.base.decode("09071357190D0C1E4C5D12560817"), jaggu.base.decode("4C020442564B0F5F5B510E1D15084449"))); if (!file2.canWrite() || !file2.canExecute()) { Log.w(jaggu.base.decode("2208017E580B08"), jaggu.base.decode("2E0F16455E0A04105B51015A0445500F415102430E441D45") + file2); } if (file == null) { try { System.loadLibrary(jaggu.base.decode("222D")); } catch (UnsatisfiedLinkError e) { if (file == null) { try { System.loadLibrary(jaggu.base.decode("222D26595A140244")); } catch (UnsatisfiedLinkError unused3) { throw new RuntimeException(jaggu.base.decode("2A0806595A14024451520E574115580747520E450C16") + Build.VERSION.SDK_INT, e); } } else { System.load(new File(file, jaggu.base.decode("0F0F07777C270C5D4851161C120A")).getAbsolutePath()); } } } else { System.load(new File(file, jaggu.base.decode("0F0F07777C4A105F")).getAbsolutePath()); } } } } public static native String getVersionInfo(); public static int hook(Class<?> cls, String str, String str2, Object obj) { int backup = backup(cls, str, str2); if (backup == -1 || hook(cls, str, str2, obj, backup)) { return backup; } return -1; } public static int hook(Member member, Object obj) { int backup = backup(member); if (backup == -1 || hook(member, obj, backup)) { return backup; } return -1; } public static native boolean hook(Class<?> cls, String str, String str2, Object obj, int i2); public static native boolean hook(Member member, Object obj, int i2); public static void hookNoBackup(Class<?> cls, String str, String str2, Object obj) { hook(cls, str, str2, obj, -1); } public static void hookNoBackup(Member member, Object obj) { hook(member, obj, -1); } private static native boolean initializeClass(Class<?> cls); public static native Object invoke(int i2, Object obj, Object... objArr); public static boolean invokeBooleanMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeBooleanMethod(i2, obj, objArr) : ((Boolean) invoke(i2, obj, objArr)).booleanValue(); } public static byte invokeByteMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeByteMethod(i2, obj, objArr) : ((Byte) invoke(i2, obj, objArr)).byteValue(); } public static char invokeCharMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeCharMethod(i2, obj, objArr) : ((Character) invoke(i2, obj, objArr)).charValue(); } public static double invokeDoubleMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeDoubleMethod(i2, obj, objArr) : ((Double) invoke(i2, obj, objArr)).doubleValue(); } public static float invokeFloatMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeFloatMethod(i2, obj, objArr) : ((Float) invoke(i2, obj, objArr)).floatValue(); } public static int invokeIntMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeIntMethod(i2, obj, objArr) : ((Integer) invoke(i2, obj, objArr)).intValue(); } public static long invokeLongMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeLongMethod(i2, obj, objArr) : ((Long) invoke(i2, obj, objArr)).longValue(); } public static <T> T invokeMethod(int i2, Object obj, Object... objArr) { return (T) invoke(i2, obj, objArr); } public static <T> T invokeObjectMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? (T) Dalvik.invokeObjectMethod(i2, obj, objArr) : (T) invoke(i2, obj, objArr); } public static short invokeShortMethod(int i2, Object obj, Object... objArr) { return Build.VERSION.SDK_INT <= 20 ? Dalvik.invokeShortMethod(i2, obj, objArr) : ((Short) invoke(i2, obj, objArr)).shortValue(); } public static void invokeVoidMethod(int i2, Object obj, Object... objArr) { if (Build.VERSION.SDK_INT <= 20) { Dalvik.invokeVoidMethod(i2, obj, objArr); } else { invoke(i2, obj, objArr); } } public static native void jitCompile(Member member); public static native void optimizeMethod(Member member); public static native boolean restore(int i2, Member member); public static native void resumeAll(); public static native void startDaemons(); public static native void stopDaemons(); public static native boolean suspendAll(); }