检测xposed等Hook框架
2023-01-24 09:16:15 最后更新
//Code By canyie
最近,iapp逆向越来越猖獗,各种方法层出不穷
其实大多数都以进程注入为核心
而Xposed框架和Substrate框架又是这一领域的佼佼者
今天我们就来尝试检测它们
在这之前先声明几个术语
xposed框架:指 rovo89 开发的Java方法劫持框架,核心思想是注入zygote进程
dexposed:指阿里开发的Dalvik上的进程内Java方法劫持框架(不考虑dev_art分支),仅限本进程
epic:指田维术开发的ART上的进程内Java方法劫持框架,仅限本进程
va:指罗迪开发的虚拟环境框架VirtualApp
vxp:指田维术基于va和epic开发的免root享受xposed的软件,核心思想是虚拟化
太极框架:指田维术基于epic开发的无需root体验xposed的软件,核心思想是修改apk(不考虑太极●Magisk版)
//检测方法0:检测XposedInstanller是否存在
//感兴趣的可以看看源码区那个
//只要稍微修改一点点小东西就可以绕过检测了
//不再赘述
//检测方法1:检测Root,感兴趣的可以看看上一篇
//缺点:误杀范围太广,无法检测免root框架等
//方法2:检测是否存在Xposed的核心类,代码如下
cls("de.robv.android.xposed.XposedBridge",klazz)
f(klazz != null) {
  tw("存在 Xposed 环境")
  }
//另外,这里可以先尝试禁用一次Xposed
cls("de.robv.android.xposed.XposedBridge",klazz)
f(klazz != null) {
  tw("存在 Xposed 环境")
  javass(disable,null,klazz,"disableHooks",true)
  f(disable) {
    tw("禁用 Xposed 成功")
    } else {
    tw("禁用 Xposed 失败")
    }
  }
//绕过检测也很容易,禁止反射xp的核心类即可
//vxp测试失败(由于ClassLoader隔离),真实xp环境应该能用
//方法3:回溯调用栈,判断是否存在xposed的
java(thread,null,"java.lang.Thread.currentThread")
java(stackTrace,thread,"java.lang.Thread.getStackTrace")
s hasHook = false
for(st;stackTrace) {
  java(sts,st,"java.lang.Object.toString")
  f(sts ? "de.robv.android.xposed." || sts ? "me.weishu.epic." || sts ? "me.weishu.exposed.") {
    s hasHook = true
    break
    }
  }
f(hasHook) {
  tw("存在Hook框架")
  }
//vxp测试失败,如果被hook应该可以
//ps:如果还需要检测va,可加上com.lody.virtual.
//然后就能直接检测vxp
//但是也会把所有使用了va的软件(比如某多开)识别出来
//绕过方法:hook掉这个方法,把关于xp的痕迹全部去掉
//方法4:读取/proc/self/maps检测是否加载过hook框架
fr("/proc/self/maps",maps)
f(maps ? "XposedBridge.jar" || maps ? "libepic.so" || maps ? "libdexposed.so" || maps ? "libsubstrate.so") {
  tw("存在Hook框架")
  }
//ps:这里只是演示用,还有很多框架没有检测,感兴趣的可以加上
//依然可以绕过,hook掉IoBridge即可。。。
//----- vxp检测专区 -----
//方法5:检测System.getProperty("vxp")是否为1
//查看vxp的源码可知,vxp启动时会调用System.setProperty("vxp","1")
//那么我们直接获取这个属性判断即可
java(isVxp,null,"java.lang.System.getProperty","String","vxp","String","0")
f(isVxp == "1") {
  tw("vxp环境")
  }
//绕过方法非常简单,去掉setProperty就行。。。
//方法6:判断应用私有目录是否在vxp的路径下
java(filesDir,activity,"android.content.Context.getFilesDir")
f(filesDir ? "io.va.exposed") {
  tw("处于vxp环境")
  }
//绕过方法依然非常简单。。。
//综上所述,检测hook框架的方法有很多,当然都有方法绕过
//不过现在的逆向插件基本都未做绕过措施
//聊胜于无吧。。。
//未完待续。。。。。。