躲避通过StackTraceElement检测xposed

/ 0评 / 0

一般检测Xposed可以通过是否getInstallApplication查看是否已经安装了Xposed框架,在程序运行时还可以通过堆栈信息或者是maps来查看是否安装了Xposed,这里主要分享一个针对Stack来躲避检测Xposed的想法

通过Stack检测一般两种手段,主动抛出一个异常,然后从Exception中去获取堆栈信息,因为Exception继承自Throwable,所以直接hook后者就行,还有一个就是通过Thread.currentTread().getStackTrace(),那这里就直接hook这两个方法就行



private void antiDetectXposed() {
        XposedHelpers.findAndHookMethod(Thread.class, "getStackTrace", new Object[0], new hook());
        XposedHelpers.findAndHookMethod(Throwable.class, "getStackTrace", new Object[0], new hook());
    }
    public class hook extends XC_MethodHook {
        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.afterHookedMethod(param);
            if (param.getResult() instanceof StackTraceElement[]) {
                StackTraceElement[] trace = (StackTraceElement[]) param.getResult();
                LinkedHashMap map = new LinkedHashMap();
                int i = 0;
                for (StackTraceElement st : trace) {
                    if (!st.getClassName().equals("de.robv.android.xposed.XposedBridge")) {
                        map.put(i, st);
                        i++;
                    }
                }
                StackTraceElement[] newTrace = new StackTraceElement[i];
                for (int j = 0; j < i; j++) {
                    newTrace[j] = map.get(j);
                }
                param.setResult((StackTraceElement[]) newTrace);
            }
        }
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            super.beforeHookedMethod(param);
        }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注