轉自:https://bbs.pediy.com/thread-249809.htm
越來越多的app對xposed進行了檢測
通過分析了其中部分對xposed檢查的代碼,希望通過xposed的方式阻止xposed檢測達到通用的目的。
一般檢查手段有很多,樓主也沒分析完,這里列舉了幾個和處理方式。
1、通過 ClassLoader 的 loadClass 加載XposedHelper 來修改一些局部變量值,阻止hook.
處理方式,通過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);
}
});
2、通過 代碼拋出一個異常,在堆棧中,查找Xposed相關的內容,進行判定
處理方式,通過Hook堆棧獲取類名替換的方式進行阻止
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、通過讀取 shell 命令 /proc/pid(應用進程id)/maps 可以拿到當前上下文的so和jar列表,查找Xposed相關
處理方式,樓主看到大部分多試通過使用 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);
}
});
4、其他,由于Xposed的hook,是通過so修改被hook的方法為native來實現的,所以檢測方也可以通過檢測方法是否變成了native來達到檢測的目的
處理方式,對指定的方法,進行返回正常的值,來達到屏蔽的效果,這里用getDeviceId舉例
// 定義全局變量 modify
XposedHelpers.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、當然還有其他各種各樣的檢測方式了,樓主所知甚少,老是提問,覺得應該分享點東西,所以有了此貼。見笑見笑