Android Hook 技术 之 VirtualApp 框架学习记录

一、VirtualApp 初识

1. VirtualApp 是一款支持应用多开的框架

虚拟应用 (Virtual App, VA): Android 系统沙盒,轻量级Android虚拟机
一句话:通过拦截应用的全部系统请求,实现对app的全面控制。

源码及官方文档介绍
https://github.com/asLody/VirtualApp
(2017/12后开源代码停止更新)

2. VA术语

(1)宿主App: 真正安装的系统上的应用, 集成了 VA libs (用户是在这个App 上添加其它应用的分身)
(2)宿主插件:在使用宿主App拓展功能时用到的,例如64位插件
(3)虚拟App(VA App) : 安装并运行在(1)宿主上的app
(4)外部App : 安装在手机真实环境上的app

3.VA技术架构

(1) VA Space: 隔离的空间,VA App运行在这个虚拟空间

(2) VA Framework: 瞒天过海

  • 修改VA App请求参数:改成宿主App 的参数信息
  • 拦截系统返回结果 :还原VA App请求时的参数

(3) VA Native
IO重定向: VA App访问绝对路径,但是没有安装到系统,需要转向VA 内部安装的路径
hook jni 函数

4. 官方总结:

通过上面技术架构可以看到,VA内部的APP实际是跑在VA自己的VA Framework之上。
VA已将其内部APP的全部系统请求进行拦截,通过这项技术也能对APP进行全面控制,而不仅仅只是多开。
并且为了方便开发者,VA还提供了SDK以及Hook SDK。

二、实践

由于官网的代码已经很旧,编译难免各种问题,找到如下Github 大神的更新贴( 2022/07)
https://github.com/ServenScorpion/VirtualApp

1. 下载代码编译

其中,根据编译提示, cmake 需下载对应 3.6 版本
实测
(1) 在Android 11真机上运行OK
(2) android 12/13 会FC ,调用栈如下, 原因有待分析(初步看是 VA lib 里出错)

2. Android 13 FC

15:04:03.178 16115 16115 AndroidRuntime: FATAL EXCEPTION: main
15:04:03.178 16115 16115 AndroidRuntime: Process: com.serven.scorpion, PID: 16115
15:04:03.178 16115 16115 AndroidRuntime: java.lang.NullPointerException: Attempt to read from fieldjava.lang.String com.lody.virtual.server.pm.parser.VPackage.packageName on a null object reference in method int com.scorpion.utils.InstallTools.checkAPKProcess(java.io.File)
15:04:03.178 16115 16115 AndroidRuntime: at com.scorpion.utils.InstallTools.checkAPKProcess(Unknown Source:10)
15:04:03.178 16115 16115 AndroidRuntime: at io.virtualapp.home.adapters.CloneAppListAdapter.(CloneAppListAdapter.java:47)
15:04:03.178 16115 16115 AndroidRuntime: at io.virtualapp.home.ListAppFragment.onViewCreated(ListAppFragment.java:105)
15:04:03.178 16115 16115 AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)

3. Android 12

14:11:23.267 27303 27303 AndroidRuntime: FATAL EXCEPTION: main
14:11:23.267 27303 27303 AndroidRuntime: Process: com.serven.scorpion, PID: 27303
14:11:23.267 27303 27303 AndroidRuntime: java.lang.RuntimeException: transact remote server failed
14:11:23.267 27303 27303 AndroidRuntime: at com.scorpion.splash.LoadingActivityOOO00O00OO0O0O0O0OOOOO0OO0O00000000O00O0OO0OOOOOO0OOO000000OOO0OO000OO0OOOOO0O00OO000O0OOOOO000OO000O0OO0O00OO0OOO00O0OO00OO00OOOO00O0OOO0O0O0000O000O0000O0O0O00OOO0000OO00O00000OO00O0O0OO000O00OO0OO00O0OO0O0OO000O0000OOOO00OO000OO00000O000O0O0OOOO00O0OOOOO00O0OOO0O0OO00000000O00000000O000OOOO0OOO00.run(Unknown Source:8) 14:11:23.267 27303 27303 AndroidRuntime: at com.lody.virtual.server.interfaces.O00O00OOO000O0000OOOOO0OO00OOOOO0OOOOO0O0OO0O0O0000000O00OOO0OOO000OO000O0O000OOOOOO0OO0O0OO00OO0000OO0O0OOO0OOOOOO0OO0O00O00O0000OOO00O0O00OOO0OOOO0O0O0O00O0O0O00OO0O0O0O0O0O00O00O00O0000OOOOOO0OOOO0O0OOO0OO00O0000000OOOO0O0O00O0OOO00OOO0OO000O000OOO0O0OOOO000OO0O0O00O00OOOOOOO0O000O0O0O000O000O00O00OOOOO0000OO00000O0OOOO00O0OO00OO0OO0000OOO000O00OO000O00OO00OOOOOO00OOO000OO0O0OO00OOOOOOOOO00OO000OOOO00O0OOO0OO00O00O0O000000O0OO00O000O0O0O0OOO0000O0O00OOO0OO00O0OO0OO000000O00OOO0O00OOOOOO00O0O00OOO00O0OO0OO0OOO0O00OO0O00OO0000000O00OO0O0OOOO00000O0OOOO00O00O0OOO0O0O0O0OO00OOOO0O000O0O000000$O00OOOOO0000OO00000O0OOOO00O0OO00OO0OO0000OOO000O00OO000O00OO00OOOOOO00OOO000OO0O0OO00OOOOOOOOO00OO000OOOO00O0OOO0OO00O00O0O000000O0OO00O000O0O0O0OOO0000O0O00OOO0OO00O0OO0OO000000O00OOO0O00OOOOOO00O0O00OOO00O0OO0OO0OOO0O00OO0O00OO0000000O00OO0O0OOOO00000O0OOOO00O00O0OOO0O0O0O0OO00OOOO0O000O0O000000.getActivityInfo(Unknown Source:40)
14:11:23.267 27303 27303 AndroidRuntime: at com.lody.virtual.client.ipc.VPackageManager.getActivityInfo(Unknown Source:4)

4. Android 11 OK

VA 的历史与版权纠纷参考
https://www.zhihu.com/question/48269910

你可能感兴趣的:(Android Hook 技术 之 VirtualApp 框架学习记录)