美文网首页
利用Xposed躲过Xposed检测

利用Xposed躲过Xposed检测

作者: Veneto_2022 | 来源:发表于2019-03-05 15:53 被阅读0次

    转自:https://bbs.pediy.com/thread-249809.htm

    越来越多的app对xposed进行了检测
    通过分析了其中部分对xposed检查的代码,希望通过xposed的方式阻止xposed检测达到通用的目的。
    一般检查手段有很多,楼主也没分析完,这里列举了几个和处理方式。
    1、通过 ClassLoader 的 loadClass 加载XposedHelper 来修改一些局部变量值,阻止hook.
    处理方式,通过Hook 类加载修改 加载的类名

    
    // 过防止调用loadClass加载 de.robv.android.xposed.
            XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    if(param.args != null && param.args[0] != null && param.args[0].toString().startsWith("de.robv.android.xposed.")){
     
                        // 改成一个不存在的类
                        param.args[0] = "de.robv.android.xposed.ThTest";
                    }
     
                    super.beforeHookedMethod(param);
                }
            });
    

    2、通过 代码抛出一个异常,在堆栈中,查找Xposed相关的内容,进行判定
    处理方式,通过Hook堆栈获取类名替换的方式进行阻止

    XposedHelpers.findAndHookMethod(StackTraceElement.class, "getClassName", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    String result = (String) param.getResult();
                    if (result != null){
                        if (result.contains("de.robv.android.xposed.")) {
                            param.setResult("");
                            // Log.i(tag, "替换了,字符串名称 " + result);
                        }else if(result.contains("com.android.internal.os.ZygoteInit")){
                            param.setResult("");
                        }
                    }
     
                    super.afterHookedMethod(param);
                }
            });
    

    3、通过读取 shell 命令 /proc/pid(应用进程id)/maps 可以拿到当前上下文的so和jar列表,查找Xposed相关
    处理方式,楼主看到大部分多试通过使用 BufferedReader进行读取命令的内容,过滤掉 XposedBridge.jar就好。

    XposedHelpers.findAndHookMethod(BufferedReader.class, "readLine", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    String result = (String) param.getResult();
                    if(result != null) {
                        if (result.contains("/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar")) {
                            param.setResult("");new File("").lastModified();
                        }
                    }
     
                    super.afterHookedMethod(param);
                }
            });
    

    4、其他,由于Xposed的hook,是通过so修改被hook的方法为native来实现的,所以检测方也可以通过检测方法是否变成了native来达到检测的目的
    处理方式,对指定的方法,进行返回正常的值,来达到屏蔽的效果,这里用getDeviceId举例

    // 定义全局变量 modify
    XposedHelpers.findAndHookMethod(Method.class, "getModifiers", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    Method method = (Method)param.thisObject;
                    String[] array = new String[] { "getDeviceId" };
                    String method_name = method.getName();
                    if(Arrays.asList(array).contains(method_name)){
                        modify = 0;
                    }else{
                        modify = (int)param.getResult();
                    }
     
                    super.afterHookedMethod(param);
                }
            });
     
            XposedHelpers.findAndHookMethod(Modifier.class, "isNative", int.class, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    param.args[0] = modify;
     
                    super.beforeHookedMethod(param);
                }
            });
    

    5、当然还有其他各种各样的检测方式了,楼主所知甚少,老是提问,觉得应该分享点东西,所以有了此贴。见笑见笑

    相关文章

      网友评论

          本文标题:利用Xposed躲过Xposed检测

          本文链接:https://www.haomeiwen.com/subject/dakouqtx.html