轉(zhuǎn)自:https://bbs.pediy.com/thread-249809.htm
越來(lái)越多的app對(duì)xposed進(jìn)行了檢測(cè)
通過(guò)分析了其中部分對(duì)xposed檢查的代碼,希望通過(guò)xposed的方式阻止xposed檢測(cè)達(dá)到通用的目的。
一般檢查手段有很多,樓主也沒(méi)分析完,這里列舉了幾個(gè)和處理方式。
1、通過(guò) ClassLoader 的 loadClass 加載XposedHelper 來(lái)修改一些局部變量值,阻止hook.
處理方式,通過(guò)Hook 類加載修改 加載的類名
// 過(guò)防止調(diào)用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.")){
// 改成一個(gè)不存在的類
param.args[0] = "de.robv.android.xposed.ThTest";
}
super.beforeHookedMethod(param);
}
});
2、通過(guò) 代碼拋出一個(gè)異常,在堆棧中,查找Xposed相關(guān)的內(nèi)容,進(jìn)行判定
處理方式,通過(guò)Hook堆棧獲取類名替換的方式進(jìn)行阻止
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、通過(guò)讀取 shell 命令 /proc/pid(應(yīng)用進(jìn)程id)/maps 可以拿到當(dāng)前上下文的so和jar列表,查找Xposed相關(guān)
處理方式,樓主看到大部分多試通過(guò)使用 BufferedReader進(jìn)行讀取命令的內(nèi)容,過(guò)濾掉 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,是通過(guò)so修改被hook的方法為native來(lái)實(shí)現(xiàn)的,所以檢測(cè)方也可以通過(guò)檢測(cè)方法是否變成了native來(lái)達(dá)到檢測(cè)的目的
處理方式,對(duì)指定的方法,進(jìn)行返回正常的值,來(lái)達(dá)到屏蔽的效果,這里用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、當(dāng)然還有其他各種各樣的檢測(cè)方式了,樓主所知甚少,老是提問(wèn),覺(jué)得應(yīng)該分享點(diǎn)東西,所以有了此貼。見(jiàn)笑見(jiàn)笑