Snapchat 如何检测 XPosed Framework?
How does Snapchat detect XPosed Framework?
我试图在我新获得 root 权限的 Xposed 智能手机上安装 Snapchat。但是登录是不可能的,因为 Snapchat 检测到 Xposed Framework。
我 "understand" 这个限制的原因,尽管我认为它有点太多了,因为我不使用 Xposed for Snapchat。
但我的问题是:他们如何检测框架?
SnapChat 使用 Google 的 SafetyNet Attestation API and does not specifically check if XPosed 安装。 SnapChat 在应用首次启动时运行 SafetyNet。
为了确保 SnapChat 不会专门检查 XPosed 框架,我反编译了 Snapchat 和 运行 grep -lri xposed
。搜索没有结果。
正在检查是否安装了 XPosed:
我相信有很多方法可以检查是否安装了 Xposed。我写了以下方法获取当前安装的 Xposed 版本或 returns null
如果 XposedBridge.jar 在设备上找不到:
/**
* 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 的官方版本,但在未来的版本中可能会中断。
我相信 Snapchat 使用 SafetyNet,API 也保护 Android Pay 和 Pokemon GO。
Xposed可以通过reflect,in class 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<>();
}
检查这些参数中是否包含您的应用信息。
我试图在我新获得 root 权限的 Xposed 智能手机上安装 Snapchat。但是登录是不可能的,因为 Snapchat 检测到 Xposed Framework。 我 "understand" 这个限制的原因,尽管我认为它有点太多了,因为我不使用 Xposed for Snapchat。
但我的问题是:他们如何检测框架?
SnapChat 使用 Google 的 SafetyNet Attestation API and does not specifically check if XPosed 安装。 SnapChat 在应用首次启动时运行 SafetyNet。
为了确保 SnapChat 不会专门检查 XPosed 框架,我反编译了 Snapchat 和 运行 grep -lri xposed
。搜索没有结果。
正在检查是否安装了 XPosed:
我相信有很多方法可以检查是否安装了 Xposed。我写了以下方法获取当前安装的 Xposed 版本或 returns null
如果 XposedBridge.jar 在设备上找不到:
/**
* 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 的官方版本,但在未来的版本中可能会中断。
我相信 Snapchat 使用 SafetyNet,API 也保护 Android Pay 和 Pokemon GO。
Xposed可以通过reflect,in class 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<>();
}
检查这些参数中是否包含您的应用信息。