文章目录

  • xposedhook原理
  • 一、检测xposed方法
    • 1.尝试加载xposed的类,如果能加载则表示已经安装了。
    • 2.检测xposed相关文件
    • 3.检测方法的调用栈
    • 4.修改hook方法的查询结果
    • 5.检测方法是否被篡改
    • 6.检测包名
  • 二、xposed对抗及检测
    • 0.通过反射重写xposed设置,直接禁用
    • 1、通过 ClassLoader 的 loadClass 加载XposedHelper 来修改一些局部变量值,阻止hook.
    • 2、堆栈判断过滤xposed的内容
    • 3、进程中过滤xposed模块
    • 4、检测java方法是否变成了native方法
  • 参考。。。

xposedhook原理

Xposed框架是由rovo89开发的一款针对Android平台的动态劫持项目,是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,通过替换/system/bin/app_process 程序控制 zygote 进程,从而使 app_process 在启动过程中加载XposedBridge.jar 这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持

Zygote进程在启动过程中,除了创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,同时还会注册一些Android核心类的JNI方法到前面创建的Dalvik虚拟机实例中去。 一个应用程序被孵化出来的时候,其不仅会获得Zygote进程中的Dalvik虚拟机实例,还会与Zygote一起共享Java运行时库,这也是可以将XposedBridge.jar这个jar包加载到每一个Android应用中的原因。
XposedBridge有一个私有的Native方法:hookMethodNative,这个方法也在app_process中使用。该函数提供一个方法对象利用Java的反射机制来对内置的方法覆写。

一、检测xposed方法

1.尝试加载xposed的类,如果能加载则表示已经安装了。

XposedHelpers类中存在fieldCache methodCache constructorCache 这三个静态成员,都是hashmap类型,凡是需要被hook的且已经被找到的对象都会被缓存到这三个map里面。
我们通过便利这三个map来找到相关hook信息。
备注:方法a是检测xposed到底改了什么东西存放到a中。抖音似乎会收集相关信息并上报。

[Java] 纯文本查看 复制代码

    public void b(){try{Object localObject = ClassLoader.getSystemClassLoader().loadClass("de.robv.android.xposed.XposedHelpers").newInstance();// 如果加载类失败 则表示当前环境没有xposed if (localObject != null){a(localObject, "fieldCache");a(localObject, "methodCache");a(localObject, "constructorCache");}return;}catch (Throwable localThrowable){}}private void a(Object arg5, String arg6){try{// 从XposedHelpers中读取相关的hook信息Field v0_1 = arg5.getClass().getDeclaredField(arg6);v0_1.setAccessible(true);Set v0_2 = v0_1.get(arg5).keySet();if (v0_2 == null){return;}if (v0_2.isEmpty()){return;}Iterator v1 = v0_2.iterator();// 排除无关紧要的类while (v1.hasNext()){Object v0_3 = v1.next();if (v0_3 == null){continue;}if (((String)v0_3).length() <= 0){continue;}if (((String)v0_3).toLowerCase().startsWith("android.support")){continue;}if (((String)v0_3).toLowerCase().startsWith("javax.")){continue;}if (((String)v0_3).toLowerCase().startsWith("android.webkit")){continue;}if (((String)v0_3).toLowerCase().startsWith("java.util")){continue;}if (((String)v0_3).toLowerCase().startsWith("android.widget")){continue;}if (((String)v0_3).toLowerCase().startsWith("sun.")){continue;}this.a.add(v0_3);}}catch (Throwable v0){v0.printStackTrace();}}

2.检测xposed相关文件

检测XposedBridge.jar这个文件和de.robv.android.xposed.XposedBridge
XposedBridge.jar存放在framework里面,de.robv.android.xposed.XposedBridge是开发xposed框架使用的主要接口。
在这个方法里读取了maps这个文件,在linux内核中,这个文件存储了进程映射了的内存区域和访问权限。在这里我们可以看到这个进程加载了那些文件。
如果进程加载了xposed相关的so库或者jar则表示xposed框架已注入。

[Java] 纯文本查看 复制代码

    public static boolean a(String paramString){try{Object localObject = new HashSet();// 读取maps文件信息BufferedReader localBufferedReader = new BufferedReader(new FileReader("/proc/" + Process.myPid() + "/maps"));// 遍历查询关键词 反编译出来的代码可能不太准确for (;;){String str = localBufferedReader.readLine();if (str == null){break;}if ((str.endsWith(".so")) || (str.endsWith(".jar"))){((Set)localObject).add(str.substring(str.lastIndexOf(" ") + 1));}}localBufferedReader.close();localObject = ((Set)localObject).iterator();while (((Iterator)localObject).hasNext()){boolean bool = ((String)((Iterator)localObject).next()).contains(paramString);if (bool){return true;}}}catch (Exception paramString){}return false;}

3.检测方法的调用栈

如果你的手机安装了xposed框架,那么你在查看app崩溃时候的堆栈信息,一定能在顶层找到xposed的类信息,
既然xposed想改你的信息,那么在调用栈里面肯定是有它的身影的。比如出现de.robv.android.xposed.XposedBridge这个类,方法被hook的时候调用栈里会出现de.robv.android.xposed.XposedBridge.handleHookedMethod 和de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative这些xposed的方法,在dalvik.system.NativeStart.main方法后出现de.robv.android.xposed.XposedBridge.main调用

[Java] 纯文本查看 复制代码

    try {throw new Exception("");} catch (Exception localException) {StackTraceElement[] arrayOfStackTraceElement = localException.getStackTrace();int m = arrayOfStackTraceElement.length;int i = 0;int j;// 遍历整个堆栈查询xposed相关信息for (int k = 0; i < m; k = j){StackTraceElement localStackTraceElement = arrayOfStackTraceElement[i];j = k;if (localStackTraceElement.getClassName().equals("com.android.internal.os.ZygoteInit")){k += 1;j = k;if (k == 2){return true;}}if (localStackTraceElement.getClassName().equals(e)){return true;}i += 1;}}return false;}try{throw new Exception("");}catch(Exception localException){arrayOfStackTraceElement = localException.getStackTrace();j = arrayOfStackTraceElement.length;i = 0;}for(;;){boolean bool1 = bool2;if (i < j){if (arrayOfStackTraceElement[i].getClassName().equals("de.robv.android.xposed.XposedBridge")){bool1 = true;}}else{return bool1;}i += 1;}

4.修改hook方法的查询结果

数组c包含了抖音里比较重要的及各类, this.a指的是检测出的被修改的方法,字段。他执行了两者的匹配,将结果存放到了一个JSONObject里面,里面包含了是否使用模拟器,系统的详细信息,是否是双开xpp,是否适用了xp,hook了那些方法等信息上报到https://xlog.snssdk.com/do/y?ver=0.4&ts=

[ HTML] 纯文本查看 复制代码

    private String[] c = {"android.os.Build#SERIAL", "android.os.Build#PRODUCT","android.os.Build#DEVICE", "android.os.Build#FINGERPRINT", "android.os.Build#MODEL", "android.os.Build#BOARD", "android.os.Build#BRAND", "android.os.Build.BOOTLOADER", "android.os.Build#HARDWARE", "android.os.SystemProperties#get(java.lang.String,java.lang.String)", "android.os.SystemProperties#get(java.lang.String)", "java.lang.System#getProperty(java.lang.String)", "android.telephony.TelephonyManager#getDeviceId()", "android.telephony.TelephonyManager#getSubscriberId()", "android.net.wifi.WifiInfo#getMacAddress()", "android.os.Debug#isDebuggerConnected()", "android.app.activitymanager#isUserAMonkey()", "com.ss."};public ArrayList<String> c(){ArrayList localArrayList = new ArrayList();Iterator localIterator = this.a.iterator();while (localIterator.hasNext()){String str1 = (String) localIterator.next();String[] arrayOfString = this.c;int j = arrayOfString.length;int i = 0;while (i < j){if (true == str1.startsWith(arrayOfString[i])){String str2 = str1.replace(")#exact", ")").replace(")#bestmatch", ")").replace("#", ".");if (str2.length() > 0){localArrayList.add(str2);}}i += 1;}}return localArrayList;}

5.检测方法是否被篡改

Modifier.isNative方法判断是否是native修饰的方法,xposedhook方法的时候,会把方法转位native方法,我们检测native方法中不该为native的方法来达到检测的目的,比如getDeviceId,getMacAddress这些方法如果是native则表示已经被篡改了。

[Java] 纯文本查看 复制代码

    public static boolean a(String paramString1, String paramString2, Class... paramVarArgs){try{// 判断方法是不是用native修饰的boolean bool = Modifier.isNative(Class.forName(paramString1).getDeclaredMethod(paramString2, paramVarArgs).getModifiers());if (bool){return true;}}catch (Exception paramString1){paramString1.printStackTrace();}return false;}

6.检测包名

这个是最简单也是最不靠谱的方法,因为只要禁止app读取应用列表就没办法了。

[Java] 纯文本查看 复制代码

    if (((ApplicationInfo)localObject).packageName.equals("de.robv.android.xposed.installer")){Log.wtf("HookDetection", "Xposed found on the system.");}

二、xposed对抗及检测

0.通过反射重写xposed设置,直接禁用

这个方法是酷安里中抄来的。重写application,在onCreate中写入

    try {Field v0_1 = ClassLoader.getSystemClassLoader().loadClass("de.robv.android.xposed.XposedBridge").getDeclaredField("disableHooks");v0_1.setAccessible(true);v0_1.set(null, Boolean.valueOf(true));}catch(Throwable v0) {}

通过xposed的hook方式阻止xposed检测达到通用的目的。

1、通过 ClassLoader 的 loadClass 加载XposedHelper 来修改一些局部变量值,阻止hook.

处理方式,通过Hook 类加载修改 加载的类名

// 过防止调用loadClass加载 de.robv.android.xposed.XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {@Overrideprotected 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";// 调整了一下,听说这样改更好,直接改部分手机有未知影响。param.setThrowable(new ClassNotFoundException("not found"));}super.beforeHookedMethod(param);}});

2、堆栈判断过滤xposed的内容

通过 代码抛出一个异常,在堆栈中,查找Xposed相关的内容,进行判定

处理方式,通过Hook堆栈获取类名替换的方式进行阻止

XposedHelpers.findAndHookMethod(StackTraceElement.class, "getClassName", new XC_MethodHook() {@Overrideprotected 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、进程中过滤xposed模块

通过读取 shell 命令 /proc/pid(应用进程id)/maps 可以拿到当前上下文的so和jar列表,查找Xposed相关

处理方式,楼主看到大部分多试通过使用 BufferedReader进行读取命令的内容,过滤掉 XposedBridge.jar就好。

XposedHelpers.findAndHookMethod(BufferedReader.class, "readLine", new XC_MethodHook() {@Overrideprotected 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、检测java方法是否变成了native方法

其他,由于Xposed的hook,是通过so修改被hook的方法为native来实现的,所以检测方也可以通过检测方法是否变成了native来达到检测的目的

处理方式,对指定的方法,进行返回正常的值,来达到屏蔽的效果,这里用getDeviceId举例

// 定义全局变量 modify
XposedHelpers.findAndHookMethod(Method.class, "getModifiers", new XC_MethodHook() {@Overrideprotected 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() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.args[0] = modify;super.beforeHookedMethod(param);}});

参考。。。

博客发布页

https://blog.coderstory.cn/about-xposed/

定制xp:
https://blog.csdn.net/qq_35834055/article/details/103256122

xposed检测方法相关推荐

  1. 从破解运动世界校园学习模拟器检测与Xposed检测

    几个月没登过csdn 期间对于安卓逆向自然是多学习了一些 本次研究学习运动世界校园的程度应该会比以前深一点 (以前发的那篇算个什么东西 简直是羞耻 留着就当激励自己了) 这次对360加固进行脱壳 拿到 ...

  2. xposed绕过模拟器检测_利用Xposed躲过Xposed检测

    越来越多的app对xposed进行了检测 通过分析了其中部分对xposed检查的代码,希望通过xposed的方式阻止xposed检测达到通用的目的. 一般检查手段有很多,楼主也没分析完,这里列举了几个 ...

  3. android8 检测xposed,Xposed检测与自定义Xposed

    Xposed检测与自定义Xposed 前言: Xposed检测 1.遍历App安装列表检测 2.自造异常检测堆栈信息. 3.检查关键Java方法是否变为native方法 4.反射XposedHelpe ...

  4. Android隐私合规检测方法

    背景: 公司的APP被工信部通报:1.在用户确认隐私权限以前会获取用户的mac地址.2.在app内频繁的获取定位,超过了场景所必须的频次. 排查过程 收到通报我们一脸懵,我们排查业务代码中没有获取ma ...

  5. xposed检测原理分析 -案例某付宝、某音

    一. 1.支付宝的Xposed hook 检测原理: Xposed Hook 框架将Hook信息存储在fieldCache, methodCache,constructorCache 中, 利用jav ...

  6. 基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测,目标追踪,卷积神经网络

    一.研究意义 卷积神经网络(CNN)由于其强大的特征提取能力,近年来被广泛用于计算机视觉领域.1998年Yann LeCun等提出的LeNet-5网络结构,该结构使得卷积神经网络可以端到端的训练,并应 ...

  7. od结构体大小_od内存断点的探析和检测方法

    作为一款流行的动态,OD 的成功离不开断点.可以说,断点成就了 OD,不难想象,如 果在调试过程中,下的断点全部失效了,那么 OD 就武功全废了.在前面的文章里,我曾介 绍 OD有三大断点:int3断 ...

  8. “半真半假”DeepFake换脸也能精准识别?阿里安全提出全新检测方法

    一段包含多个人脸的视频中,攻击者只对一个或者几个人的人脸进行伪造,这种"半真半假"的伪造情况能否被检测识别?近日,阿里安全图灵实验室宣布,其已成功打造出针对这种换脸视频的DeepF ...

  9. 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)

    作者 | 黄浴 来源 | 转载自知乎专栏自动驾驶的挑战和发展 [导读]在近日发布的<值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)>一文中,作者介绍了一部分各大公司和机构基于 ...

最新文章

  1. python语言入门r_小结:jieba分词的Python与R语言基础用法介绍
  2. java分代技术_JVM调优总结(六):分代垃圾回收详述2
  3. 硅片行业:过剩背景下的寡头市场
  4. python函数对变量的作用域_python函数变量作用域如何理解使用?
  5. java实现modbustcp通讯_Modbus TCP双通道冗余技术
  6. 关于不同用户进入系统报错的请求
  7. 视频播放问题和提高性能方案
  8. 求职过程记录(4)——启明星出现
  9. 任务之间的依赖(NSOperation)
  10. maven 的 oracle的Missing artifact com.oracle:******:jar:11.2.0.2.0
  11. 全国大学生恩智浦杯智能汽车竞赛
  12. linux系统桌面放大镜,Ubuntu下怎样使用放大镜辅助功能
  13. 怎么彻底卸载cad2017_AutoCAD彻底卸载方法
  14. 力扣刷题 DAY_81 贪心
  15. Daedalus Icarus
  16. Forbidden什么意思
  17. python123测验答案第十周_智慧职教mooc的APPPython程序设计(常州工业职业技术学院)章节测验答案...
  18. 人工智能应用最多的七大领域解析
  19. python怎么输出所有奇数_python输出100以内奇数的几种输出方式-Go语言中文社区
  20. 数据库——sql server安装教程

热门文章

  1. 給windowsXP穿上Linux Ubuntu的漂亮馬甲 1
  2. docker add new port
  3. cote dlvoire_科特迪瓦-COTE D‘ IVOIRE-阿比让-ABIDJAN-港口介绍,港口介绍-环球运费网...
  4. 园区网的网关部署在接入层还是汇聚层 面试官与求职者之间谈话
  5. 4.2 人工智能产业岗位分布
  6. 金融统计分析python论文_比较好写的本科金融专业论文题目 本科金融专业论文题目怎么取...
  7. 127:vue+openlayers 使用CRTL控制map拖拽和鼠标滚动 (示例代码)
  8. 安装office提示Office 16 Click-to-Run Extensibility Component
  9. 网上办公自动化|OA系统
  10. 抖音同款雪花飘落圣诞树