【问题标题】:How does Snapchat detect XPosed Framework?Snapchat 如何检测 XPosed 框架?
【发布时间】:2016-10-28 07:54:24
【问题描述】:

我试图在我新植根的 Xposed 智能手机上安装 Snapchat。但是登录是不可能的,因为 Snapchat 检测到 Xposed 框架。 我“理解”这个限制的原因,尽管我认为这有点过分,因为我不使用 Xposed for Snapchat。

但我的问题是:他们如何检测框架?

【问题讨论】:

  • 您想知道 Snapchat 是如何准确检测 Xposed 的,或者您如何自己检测到它?
  • 这只是为了好奇,但我认为这两个很有趣。
  • 我刚刚写了一个获取当前安装的Xposed版本的方法。我安装了 Xposed 并且 Snapchat 并没有限制我。我还反编译了 Snapchat 并搜索了 xposed 并没有结果。

标签: android snapchat xposed xposed-framework


【解决方案1】:

SnapChat 使用 Google 的 SafetyNet Attestation API,并不会专门检查是否安装了 XPosed。 SnapChat 会在应用首次启动时运行 SafetyNet。

为确保 SnapChat 不会专门检查 XPosed 框架,我反编译了 Snapchat 并运行 grep -lri xposed。搜索没有结果。

检查是否安装了 XPosed:

我确信有很多方法可以检查 Xposed 是否已安装。我编写了以下方法,该方法获取当前安装的 Xposed 版本,如果在设备上未找到 XposedBridge.jar,则返回 null

/**
 * Get the current Xposed version installed on the device.
 * 
 * @param context The application context
 * @return The Xposed version or {@code null} if Xposed isn't installed.
 */
public static Integer getXposedVersion(Context context) {
  try {
    File xposedBridge = new File("/system/framework/XposedBridge.jar");
    if (xposedBridge.exists()) {
      File optimizedDir = context.getDir("dex", Context.MODE_PRIVATE);
      DexClassLoader dexClassLoader = new DexClassLoader(xposedBridge.getPath(),
          optimizedDir.getPath(), null, ClassLoader.getSystemClassLoader());
      Class<?> XposedBridge = dexClassLoader.loadClass("de.robv.android.xposed.XposedBridge");
      Method getXposedVersion = XposedBridge.getDeclaredMethod("getXposedVersion");
      if (!getXposedVersion.isAccessible()) getXposedVersion.setAccessible(true);
      return (Integer) getXposedVersion.invoke(null);
    }
  } catch (Exception ignored) {
  }
  return null;
}

据我所知,Xposed 一直在 /system/framework 中有 XposedBridge.jar,因此这应该适用于 Xposed 的官方版本,但可能会在未来的版本中中断。

【讨论】:

  • 这正是我想到的方法(检查特定文件的存在)。但是,为什么该文件的名称不随机化,以至于“几乎不可能”检测到它?
  • @Gp2mv3 因为它不会使其更难检测。检测 Xposed 的其他方法包括抛出一个虚拟异常并检查 Xposed 方法是否在堆栈跟踪中,以及检查 Xposed 安装程序是否存在。另外,如果 JAR 文件名是随机的,Xposed 怎么知道在哪里找到它?
  • 理论上不能上钩吗?
【解决方案2】:

我相信 Snapchat 使用了SafetyNet,该 API 还可以保护 Android Pay 和 Pokemon GO。

【讨论】:

    【解决方案3】:

    Xposed可以通过反射检查,在XposedHelper类中

    public class XposedHelper {
        private static final String LOGTAG = "XposedHelpers";
        private static final HashMap<String, Field> fieldCache = new HashMap<>();
        private static final HashMap<String, Method> methodCache = new HashMap<>();
        private static final HashMap<String, Constructor<?>> constructorCache = new HashMap<>();
        private static final WeakHashMap<Object, HashMap<String, Object>> additionalFields = new WeakHashMap<>();
        private static final HashMap<String, ThreadLocal<AtomicInteger>> sMethodDepth = new HashMap<>();
    }
    

    检查这些参数中是否包含您的应用信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多