转自:https://www.52pojie.cn/thread-691584-1-1.html

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

环境:      win10 x64
使用的工具:apkdb & jeb 2.2.7

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

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

    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框架已注入。

 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调用

    try {throw new Exception("");} catch (Exception localException) {StackTraceElement[] arrayOfStackTraceElement = localException.getStackTrace();int m = arrayOfStackTraceElement.length;int i = 0;int j;// 遍历整个堆栈查询xposed相关信息 检测 ZygoteInit 是否出现了2次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=

  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 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则表示已经被篡改了。

 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读取应用列表就没办法了。

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

反制xposed

1.通过反射重写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框架的检测和反制相关推荐

  1. Android之Xposed框架完全使用指南

    文章目录 Xposed环境搭建 Xposed简介 Xposed原理 Xposed的安装 Xposed插件开发 Xposed插件编写流程 Xposed开发之Hook构造函数 相关API 无参构造函数的h ...

  2. 记录手机root后安装xposed框架后变砖无法开机的问题

    问题及解决方法 机型说明 问题描述 自己造的孽自己承受 刷入TWRP工具(简单来说就是下载TWRP工具) 正式将工具刷入手机替换掉原来官方Recovery 将前面提到的Xposed框架卸载包刷入手机 ...

  3. Android Xposed 框架

    一.Xposed框架简介 ● Xposed是Android平台上的一个常用的HOOK框架,可以在不改变程序源代码的前提下,影响程序的运行.一个支持Xposed的Android应用程序被称为一个Xpos ...

  4. 定制Xposed框架(干货)

    由于很多APP开始针对XP做对应的检测如微信 支付宝 钉钉等 所以使用定制化的方式隐藏框架 常见检测方法 一. 由于Xposed的hook,是通过so修改被hook的方法为native来实现的,所以检 ...

  5. 万物皆可 Hook,探究 Xposed 框架 Hook 原理

    作者 |俞家欢 低头需要勇气,抬头需要实力 引言 平时用着 Android 手机,喜欢折腾的同学或多或少都接触过 Xposed 框架,解锁.Root.刷包,一气呵成.本文将从原理和实践两部分带大家了解 ...

  6. xposed绕过模拟器检测_反xposed检测下载|国外xposed反检测工具(project cerberus)下载v1.4.3 安卓版_ 2265安卓网...

    国外xposed过检测工具是一款能隐藏xposed框架的辅助工具,它能绕过apk的签名验证,绕过手机系统的某些限制,成功修改apk的框架服务,也可以多模拟位置,root系统进行隐藏,提供伪造信息,对你 ...

  7. xposed反模拟器检测_太极xposed模块使用教程

    今天给大家分享一下太极xposed模块使用教程.很多小伙伴说下载不到Xposed模块,这个网上其实很多,但是第三方的下载站就算了吧.我也是一个深受其害的网瘾少年,只要是下载站的软件,一不留心一次性电脑 ...

  8. Nexus5 Android6.0.1 MOB30H 刷机、获取ROOT、刷入xposed框架

    Nexus5 Android6.0.1 MOB30H 刷机.获取ROOT.刷入xposed框架 本文仅供学习交流使用,如侵立删! 知识准备 刷机之前需要了解的一些知识 ROM刷机 ROM是ROM im ...

  9. 安卓虚拟机_一个手机变两个!安卓机上的安卓虚拟机,自带Xposed框架!

    手机技巧108式每天分享好玩实用的APP软件.和手机技巧资讯,喜欢玩手机的朋友记得关注我! 今天给大家分享的是一款安卓虚拟机模拟器,比较特别的是它是在安卓手机上运行的安卓虚拟机. 有点像双开软件的意思 ...

最新文章

  1. Redhat linux5.5下Oracle 10g 安装配置手册一
  2. JavaScript中的true和false
  3. Use Batch Apex
  4. oracle密码加密工具下载,oracle加密工具wrap
  5. java redis使用卡死_jedispool连redis高并发卡死的问题
  6. telnet命令详解
  7. Centos 8 RHEL 8 破解root密码
  8. java 7个数排序_JAVA基础(7)-数组的排序
  9. windows资源监控
  10. matlab之简单粒子群的函数寻优
  11. python del 函数
  12. C++ tbb unsafe_erase() 并发访问 解决方案
  13. 20191102每日一句
  14. linux命令整理(三)
  15. Java 超简单实现邮件群发工具类 | 泰山出品
  16. linux关于系统管理、系统安全命令
  17. EXCEL表格中如何给奇偶数行填充不同颜色
  18. 苹果appstore新推出了抽成收益降到15%的计划,正在申请中...
  19. Web:flex模拟移动商城首页页面布局/grid布局的相关属性
  20. js 截取 指定 字符前面或者后面的字符串

热门文章

  1. Vue判断IE浏览器版本并提示
  2. 基于S3C2440的电子鹰眼监控系统设计
  3. 乌合之众 -- 群体的意见和信念
  4. 读书寄语:所有的遇见都是有原因的,并不只是偶然
  5. 谷歌浏览器与驱动下载,以及放置位置
  6. java中计算一段时间内白天的时间和夜晚的时间
  7. 电子认证许可证书(电子签名 需要 什么资质)
  8. 电机与运动控制笔记整理(三)——异步电机概述
  9. java蓝桥杯数字黑洞_【蓝桥杯】数字黑洞(5位黑洞数)
  10. Java----线程学习(多线程)