autojs 被检测已经不是啥稀罕事了。各种帖子也很多,有讨论扫描进程,扫描应用和无障碍检测的。这里简单做下笔记,不懂安卓,水平有限,见谅。
以下代码均可以直接在autojs 中运行。
系统无障碍检测
这个属于系统基本的设置,只要开启了任何应用都可以查询到。所以对于不允许无障碍开启的app 就很麻烦了,比如i茅台。按照找到的帖子的方法是需要 从系统底层进行干预,比如 面具、Xposed 框架、非残模块等。通过拦截hook屏蔽某个应用的进行系统无障碍检测。
let am = context.getSystemService(android.content.Context.ACCESSIBILITY_SERVICE);
let isAccessibilityEnabled_flag = am.isEnabled();
console.log('系统无障碍服务开启:'+isAccessibilityEnabled_flag);
检测包名
在较老的版本中,获取安装应用的接口是没有限制的(部分系统除外),那么可以通过白名单或者黑名单简单的检测出autojs。特别是直接使用原本app 运行脚本的。打包成应用可以躲过该检测。但也只是好一点点
let gpm = context.getPackageManager()
let installedPackageInfoList = gpm.getInstalledPackages(0);
for (let i in installedPackageInfoList){
if(/yourPackageName/.test(installedPackageInfoList[i])){
console.log(installedPackageInfoList[i])
}
}
检测包的 activities 和 services
依然需要获取安装应用的接口,但包名被修改了,躲过了上面的检查,那么通过检测应用的 activities 和 services还是直接被检测到 。
这个方法针对用autojs应用修改包名打包应用的应用。因为被打包时壳是不变的,里面的AndroidManifest.xml是写死的。要逃过检测的话,估计要重新修改源码后再编译个新的。当然通过各种魔法去应用应用或者直接限制接口权限也是可以的。
let gpm = context.getPackageManager()
let installedPackageInfoList = gpm.getInstalledPackages( gpm.GET_SERVICES |gpm.GET_ACTIVITIES);
for (let i in installedPackageInfoList){
if(/yourPackageName/.test(installedPackageInfoList[i])){
console.log(installedPackageInfoList[i])
console.log(installedPackageInfoList[i].packageName)
for (let j in installedPackageInfoList[i].activities){
if(/auto/.test(installedPackageInfoList[i].activities[j])){
console.log(installedPackageInfoList[i].activities[j])
}
}
for (let j in installedPackageInfoList[i].services) {
if(/auto/.test(installedPackageInfoList[i].services[j])){
console.log(installedPackageInfoList[i].services[j])
}
}
if(/auto/.test(gpm.getPackageInfo(installedPackageInfoList[i].packageName,gpm.GET_PERMISSIONS).requestedPermissions)){
console.log(gpm.getPackageInfo(installedPackageInfoList[i].packageName,gpm.GET_PERMISSIONS).requestedPermissions)
}
}
}
检测进程
这是在些帖子上面看到的,但我不知道如何做到。待研究。
行为检测
这点就记着, 这里不讨论。
参考
IAmNotDisabled