Android 应用多开对抗实践
白天午睡梦到些以前给某行业安全峰会写了材料,醒来后把记得的部分重新整理一下,分享出来给大家,尽量写得简洁明了。
未必准确,仅供参考,欢迎纠正补充
应用多开技术总结
系统级技术多开技术方案
发行版 APP
Android 多用户功能
OEM系统自带的"手机分身"、"应用双开",和 "Island/炼妖壶" 等各种 "Android for work" 产品
chroot
暂无发现 APP
多用户功能
多用户模式主要用到 UserManager 相关类,切换不同的用户,在不同的用户下运行 App,实现多开。最直观的例子是 Android 手机上的 多用户 功能, 手机分身 功能,以及 am switch-user 命令,这种简单粗暴的用法会将 Android 服务都运行一份,如果只用于应用多开,且不说资源消耗,切换用户是在麻烦。
在 Android 5.0 在基于多用户功能 添加了 Android for work 功能,可以在同一个桌面启动器下使用受限用户启动 APP,不再需要切换界面。同时将权限开发给了非系统应用。
chroot
UNIX 的 chroot 系统调用在 Android 上也能用,需要 root 权限。在本地挂载运行精简版系统镜像,使用远程桌面软件如 VNC 等访问本地多开的系统。尚未发现发行版 APP,可能在 ARM 服务器云手机中用到。
用户级技术多开技术方案
发行版 APP
VirtualApp
VirtualXposed, DualSpace
MultiDroid
LBE平行空间, Parallel Space
DroidPlugin
分身大师
Excelliance
双开助手, MultiAccount
其它
虚拟大师
在用户级的多开技术中,还可以在按设计用途划分出三类
“容器”:VirtualApp、MultiDroid
热更新/插件化:DroidPlugin、Excelliance
虚拟系统:虚拟大师
具体实现原理大家可以翻论坛里的 精品贴,这里不多描述。
值得一提的是,某云手机团队的 "虚拟大师" 产品,实现在用户态运行了一个精简版的 Android 系统镜像,在系统库中拦截了几乎所有系统调用,使用类似前文提到的 chroot 挂载系统镜像的方法运行,有兴趣的同学可以看一看。
拆招
反系统级应用多开仅多用户方案的多开,忽略 chroot /lxc
简单粗暴的代码// --- C++ ---
#include
bool isDualApp(){return 0 != getuid()/100000;}
// --- Java ---
import android.os.Process;
static boolean isDualApp(){return 0 != Process.myUid() / 100000;}
一行代码完事了?
完事了,真的完事了。
但是为什么?
Android 系统中,如果开启了多用户模式,会存在一个主用户和若干受限用户。
把 MIUI 的 "手机分身" 和 "应用双开" 功能都打开,可以看到有三用户,0、11 和 999,分别对应主用户、"手机分身" 和 &#