吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5323|回复: 4
收起左侧

[Android 原创] 安卓反调试|常见的Xposed框架检测手段与突破方式

[复制链接]
lateautumn4lin 发表于 2020-3-13 23:20
本帖最后由 lateautumn4lin 于 2020-3-19 17:12 编辑

Xposed框架被很多人用来注入App做一些Hook操作,当然有相应的注入也必然存在对应的检测(反调试)操作,之前在吾爱、看雪论坛上看到很多大佬花式突破Xposed检测的手法,所以秉承“拿来主义”,汇总了一下各大App常见的Xposed的检测手法和突破的方式(这里只讲关于在Java层面检测Xposed,深入到SO层作检测之后再讲)。Xposed检测方案以及突破方式1. 遍历App安装列表检测原理:当App获取到系统权限的时候,可以获取系统的所有运行中的App的列表,通过列表发现是否存在有Xposed相关的App(通常都是Xposed Installer相关的Apk,例如de.robv.android.xposed.installer)保持运行状态,一旦存在,就表明用户很有可能存在Hook行为。解决方案:目前市面上的大多数手机厂都把应用权限暴露给用户,所以用户可以自定义App的权限,禁止相关的App获取应用列表就可以防止App通过这个途径检测Xposed框架,当然,要过这个检测也可以修改Installer包名即可。2. 通过自造异常检测堆栈信息,读取异常堆栈中是否包含Xposed字符串来识原理:在正常的Android系统启动过程中,init进程会去解析init.rc文件启动一系列的服务,其中就有app_process进程,在app_process执行过程中,会设置自身进程名为Zygote,启动com.android.internal.os.ZygoteInit.Main方法。而Xposed修改了app_process进程,会先启动de.robv.android.xposed.XposedBridge.Main方法,再由它去启动com.android.internal.os.ZygoteInit.Main方法,因此堆栈信息中会多出一些内容。简单说就是Xposed先于了Zygote进程,因此在系统堆栈信息中会多出Xposed相关的内容。解决方案:通过Hook堆栈类StackTraceElement,当发现Xposed和Zygote有错误输出时,修改输出信息,例如将输出置空来绕过错误信息检测。参考代码: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. 通过ClassLoader的 loadClass 加载列表检测解决方案:通过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);            }        });复制代码4. 由于Xposed的注入方式是通过底层SO文件修改被hook的方法为native来实现的,所以检测方也可以通过检测方法是否变成了native来达到检测的目的原理:Xposed把Method的nativefunc修改为它自己的处理函数,再这个函数中会回调Java层的handleHookMethod,处理函数钩子,但是只有native函数,虚拟机才会走nativefunc,所以Xposed会把java函数的修饰符修改为native,所以可以通过反射调用Modifier.isNative(method.getModifiers())方法可以校验方法是不是native方法解决方案:因为检测方必须要通过Modifier.isNative这个方式来做检测,所以方法就是通过Hook isNative的方法,将检测结果置为0就行了参考代码:// 定义全局变量 modifyXposedHelpers.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相关文件原理:通过读取proc/self/maps文件,在linux内核中,这个文件存储了进程映射了的内存区域和访问权限,因此遍历自身加载的库,就可以拿到当前上下文的so和jar列表,通过查找Xposed相关文件来做检测解决方案:因为读取的时候会调用BufferedReader进行读取命令的内容,我们只需要Hook 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);            }        });复制代码6. 通过反射XposedHelper类和XposedBridge类做信息检测原理:Xposed中有几个比较常用的方法,findAndHookMethod等。通过反射找到要Hook的函数后会保存到XposedHelper类中的fieldCache、methodCache、constructorCache字段中。因此,可以通过反射遍历XposedHelper类中的fieldCache、methodCache、constructorCache变量,读取HashMap缓存字段是否有被Hook App的关键函数信息就行解决方案:检测方通过反射调用XposedHelper的成员fieldCache中是否含有相关的关键字,解决方案就是修改类名,让检测方找不到相关类就行,可以参考第三种方案,修改类名参考代码:无如何定位Xposed检测代码关于如何定位,最有效的方案就是搜索相关的关键词,例如上述几种检测方案中说的某些关键词
作者:云爬虫技术研究笔记
链接:https://juejin.im/post/5e6b8fd1518825495e10628b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

免费评分

参与人数 2吾爱币 +1 热心值 +1 收起 理由
q868 + 1 大佬怎么联系你 想做你帮忙做一个 最新的快手Sig 有偿 价格可以谈 怎么联系.
O小流O + 1 内容应该不错,就是排版让人心碎

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2020-3-16 15:09
格式太乱了,编辑下吧。
hbyybw 发表于 2020-3-17 16:18
 楼主| lateautumn4lin 发表于 2020-3-19 17:12
轻描淡写9714 发表于 2020-4-5 11:10
能干掉中国移动APP检测EDxp的问题么?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表