TikTok.apk(点击下载) / XposedBridge.java


package andhook.lib.xposed;

import andhook.lib.AndHook;
import andhook.lib.xposed.XC_MethodHook;
import android.util.Log;
import i.am.jaggu;
import java.lang.reflect.Constructor;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;

public final class XposedBridge {
    public static final ClassLoader BOOTCLASSLOADER = ClassLoader.getSystemClassLoader();
    private static final Object[] EMPTY_ARRAY = new Object[0];
    public static final String TAG = "AndHook";
    private static final ConcurrentHashMap<Member, AdditionalHookInfo> sHookedMethodInfos = new ConcurrentHashMap<>();

    /* access modifiers changed from: private */
    public static final class AdditionalHookInfo {
        final CopyOnWriteSortedSet<XC_MethodHook> callbacks;
        final Member method;
        final int slot;

        private AdditionalHookInfo(Member member, int i2) {
            this.callbacks = new CopyOnWriteSortedSet<>();
            this.method = member;
            this.slot = i2;
        }
    }

    public static final class CopyOnWriteSortedSet<E> {
        private volatile transient Object[] elements = XposedBridge.EMPTY_ARRAY;

        private int indexOf(Object obj) {
            for (int i2 = 0; i2 < this.elements.length; i2++) {
                if (obj.equals(this.elements[i2])) {
                    return i2;
                }
            }
            return -1;
        }

        public synchronized boolean add(E e) {
            if (indexOf(e) >= 0) {
                return false;
            }
            Object[] objArr = new Object[(this.elements.length + 1)];
            System.arraycopy(this.elements, 0, objArr, 0, this.elements.length);
            objArr[this.elements.length] = e;
            Arrays.sort(objArr);
            this.elements = objArr;
            return true;
        }

        public Object[] getSnapshot() {
            return this.elements;
        }

        public synchronized boolean remove(E e) {
            int indexOf = indexOf(e);
            if (indexOf == -1) {
                return false;
            }
            Object[] objArr = new Object[(this.elements.length - 1)];
            System.arraycopy(this.elements, 0, objArr, 0, indexOf);
            System.arraycopy(this.elements, indexOf + 1, objArr, indexOf, (this.elements.length - indexOf) - 1);
            this.elements = objArr;
            return true;
        }
    }

    static {
        AndHook.ensureNativeLibraryLoaded(null);
    }

    public static int getBackupSlot(Member member) {
        AdditionalHookInfo additionalHookInfo = sHookedMethodInfos.get(member);
        if (additionalHookInfo != null) {
            return additionalHookInfo.slot;
        }
        return -1;
    }

    private static Object handleHookedMethod(Object obj, Object obj2, Object[] objArr) throws Throwable {
        AdditionalHookInfo additionalHookInfo = (AdditionalHookInfo) obj;
        Object[] snapshot = additionalHookInfo.callbacks.getSnapshot();
        int length = snapshot.length;
        if (length == 0) {
            return invokeOriginalMethod(additionalHookInfo.slot, obj2, objArr);
        }
        XC_MethodHook.MethodHookParam methodHookParam = new XC_MethodHook.MethodHookParam();
        methodHookParam.slot = additionalHookInfo.slot;
        methodHookParam.method = additionalHookInfo.method;
        methodHookParam.thisObject = obj2;
        methodHookParam.args = objArr;
        int i2 = 0;
        while (true) {
            try {
                ((XC_MethodHook) snapshot[i2]).beforeHookedMethod(methodHookParam);
                if (methodHookParam.returnEarly) {
                    i2++;
                    break;
                }
            } catch (Throwable th) {
                log(th);
                methodHookParam.setResult(null);
                methodHookParam.returnEarly = false;
            }
            i2++;
            if (i2 >= length) {
                break;
            }
        }
        if (!methodHookParam.returnEarly) {
            try {
                methodHookParam.setResult(invokeOriginalMethod(additionalHookInfo.slot, methodHookParam.thisObject, methodHookParam.args));
            } catch (Throwable th2) {
                methodHookParam.setThrowable(th2);
            }
        }
        int i3 = i2 - 1;
        do {
            Object result = methodHookParam.getResult();
            Throwable throwable = methodHookParam.getThrowable();
            try {
                ((XC_MethodHook) snapshot[i3]).afterHookedMethod(methodHookParam);
            } catch (Throwable th3) {
                log(th3);
                if (throwable == null) {
                    methodHookParam.setResult(result);
                } else {
                    methodHookParam.setThrowable(throwable);
                }
            }
            i3--;
        } while (i3 >= 0);
        if (!methodHookParam.hasThrowable()) {
            return methodHookParam.getResult();
        }
        throw methodHookParam.getThrowable();
    }

    public static HashSet<XC_MethodHook.Unhook> hookAllConstructors(Class<?> cls, XC_MethodHook xC_MethodHook) {
        HashSet<XC_MethodHook.Unhook> hashSet = new HashSet<>();
        for (Constructor<?> constructor : cls.getDeclaredConstructors()) {
            hashSet.add(hookMethod(constructor, xC_MethodHook));
        }
        return hashSet;
    }

    public static HashSet<XC_MethodHook.Unhook> hookAllMethods(Class<?> cls, XC_MethodHook xC_MethodHook) {
        HashSet<XC_MethodHook.Unhook> hashSet = new HashSet<>();
        for (Method method : cls.getDeclaredMethods()) {
            hashSet.add(hookMethod(method, xC_MethodHook));
        }
        return hashSet;
    }

    public static HashSet<XC_MethodHook.Unhook> hookAllMethods(Class<?> cls, String str, XC_MethodHook xC_MethodHook) {
        HashSet<XC_MethodHook.Unhook> hashSet = new HashSet<>();
        Method[] declaredMethods = cls.getDeclaredMethods();
        for (Method method : declaredMethods) {
            if (method.getName().equals(str)) {
                hashSet.add(hookMethod(method, xC_MethodHook));
            }
        }
        return hashSet;
    }

    public static XC_MethodHook.Unhook hookMethod(Member member, XC_MethodHook xC_MethodHook) {
        if (!(member instanceof Method) && !(member instanceof Constructor)) {
            throw new IllegalArgumentException(jaggu.base.decode("2C08094F17090644505F064141045A0213570E591242161050440C4045135A510D460753170C0C5F5355060841") + member.toString());
        } else if (!Modifier.isAbstract(member.getModifiers())) {
            AdditionalHookInfo additionalHookInfo = sHookedMethodInfos.get(member);
            if (additionalHookInfo == null) {
                if (Modifier.isStatic(member.getModifiers())) {
                    AndHook.ensureClassInitialized(member.getDeclaringClass());
                }
                additionalHookInfo = new AdditionalHookInfo(member, AndHook.backup(member));
                if (additionalHookInfo.slot != -1) {
                    additionalHookInfo.callbacks.add(xC_MethodHook);
                    if (AndHook.hook(member, additionalHookInfo, additionalHookInfo.slot)) {
                        sHookedMethodInfos.put(member, additionalHookInfo);
                    } else {
                        throw new RuntimeException(jaggu.base.decode("25070C5A5200434457100A5D0E0E140B5640095805455E45") + member.toString());
                    }
                } else {
                    throw new RuntimeException(jaggu.base.decode("25070C5A5200434457100053020E411613590443095900160910") + member.toString());
                }
            } else if (additionalHookInfo.method.getDeclaringClass().getClassLoader().equals(member.getDeclaringClass().getClassLoader())) {
                additionalHookInfo.callbacks.add(xC_MethodHook);
            } else {
                throw new RuntimeException(jaggu.base.decode("3608004E470100445D544241000851465E51155F0E5217454459175A5F5D19540A00035345010D535D10217E5B45") + member.toString());
            }
            xC_MethodHook.getClass();
            return new XC_MethodHook.Unhook(additionalHookInfo.method, additionalHookInfo.slot);
        } else {
            throw new IllegalArgumentException(jaggu.base.decode("20070B5858104358575F09120007471241550243415B01115B5F07410C13") + member.toString());
        }
    }

    public static Object invokeOriginalMethod(int i2, Object obj, Object[] objArr) {
        return AndHook.invoke(i2, obj, objArr);
    }

    public static Object invokeOriginalMethod(Member member, Object obj, Object[] objArr) {
        int backupSlot = getBackupSlot(member);
        if (backupSlot != -1) {
            return invokeOriginalMethod(backupSlot, obj, objArr);
        }
        return null;
    }

    public static void log(String str) {
        Log.i(jaggu.base.decode("2208017E580B08"), str);
    }

    public static void log(Throwable th) {
        Log.e(jaggu.base.decode("2208017E580B08"), Log.getStackTraceString(th));
    }

    public static void unhookMethod(Member member, XC_MethodHook xC_MethodHook) {
        AdditionalHookInfo additionalHookInfo = sHookedMethodInfos.get(member);
        if (additionalHookInfo != null) {
            additionalHookInfo.callbacks.remove(xC_MethodHook);
        }
    }

    public static boolean unhookMethod(Member member, int i2) {
        boolean restore = AndHook.restore(i2, member);
        if (restore) {
            sHookedMethodInfos.remove(member);
        }
        return restore;
    }
}