之前看到有人发了关于使用xposed屏蔽抖音检测xposed的思路(https://www.52pojie.cn/thread-684757-1-1.html),贴出了部分伪代码,
但觉抖音写的蛮有意思的,自己对这方面也不是很清楚,毕竟Android我没怎么学习。借这个机会,了解一下。写的不是很清楚,大家多多抱哈啊!~~
整理了一下文档,我发现抖音主要使用了以下的手段检测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;