前言
我每天下班回家都要启动一个APP打开小区门禁,之前一直使用手机上的华为语音助手中录制技能从而语音操控手机开门,用着虽然没有NFC方便,但是离小区门几米就开始执行录制的技能,倒也不失优雅。可是前几天APP居然升级了,我一看更新提示“1.优化广告展示...。2.xxx”感觉界面或者启动速度会有些提升吧,于是我就更新了。结果我中招了,居然新增了启动屏广告!!!每次打开APP消耗我几百kb流量不说,还会大概率导致我的语音助手技能执行到一半就结束了。本来想找到老版本重装一次,因为懒得找,就算了,换个狠点的方案!之前有试过反编译,想提取开门相关的接口再写个APP进行控制,精简和提速,结果apk混淆比较厉害,逆向工程也不太熟手。所以,今天我要用一种技术成本更低的方案,资源成本较高的方案。那就是:把这渣渣APP保持运行在安卓虚拟机上,安卓虚拟机运行在我的个人服务器上,然后通过Appium控制虚拟机模拟点击开门按钮。好吧,先在我服务器上安装一个Virtualbox
。
这个方案并没有成功实现我的目的,解决问题请看下一篇博客
安装Virtualbox
先检查依赖关系
yum -y install gcc make glibc kernel-headers kernel-devel dkms
一般情况下,会提示已经是最新的软件,无需安装。如果原系统这些软件没有安装或没有更新到最新版本,那么安装完成之后,最好重启一下机子。
下载官方最新安装包
这里要根据自己的内核去选择,可以通过uname -r
查看内核版本,我的机子是3.10.0-1062.9.1.el7.x86_64
,所以我选择_el7-1.x86_64.rpm
结尾的安装包
传送门
curl -O http://download.virtualbox.org/virtualbox/6.1.0_RC1/VirtualBox-6.1-6.1.0_RC1_134891_el7-1.x86_64.rpm
接下来进行安装
sudo rpm -ivh VirtualBox-6.1-6.1.0_RC1_134891_el7-1.x86_64.rpm
检查是否存在异常
执行以下命令配置vbox
sudo /sbin/vboxconfig
如果只出现以下三行,就是安装成功了,否则就是失败了,要看具体提示什么错误,进而针对地解决掉。
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
我安装的时候就是失败了,我的操作就是更新内核,然后重启,后来猜测我应该只是缺少重启而已并不需要更新什么,所以如果你也遇到了这个问题,建议先重启后执行/sbin/vboxconfig
试试,而不是先更新内核。
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-ml
yum --enablerepo=elrepo-kernel install kernel-ml-devel
参考链接:Centos7 升级内核版本
我操作的时候把内核切换了结果开不了机,赶紧在rescue模式切换回去了,所以并不一定需要执行上面的,也不需要切换到最新内核
安装扩展包
传送门
同样需要根据自己的内核版本去选择
curl -O http://download.virtualbox.org/virtualbox/6.1.0_RC1/Oracle_VM_VirtualBox_Extension_Pack-6.1.0_RC1.vbox-extpack
sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.0_RC1.vbox-extpack
VBoxManage list extpacks
新建用户
这里设置的密码等会需要用到
useradd vbox
passwd vbox
gpasswd -a vbox vboxusers
启动vbox的restful管理服务
以vbox
用户的身份后台运行vboxwebsrv
服务并且绑定所有IP和取消认证
su - vbox -c "vboxwebsrv -b -H 0.0.0.0 -A null"
Docker运行phpvirtualbox
本来我打算使用jazzdd/phpvirtualbox
这个镜像的,结果这个镜像不支持6.0以上的vbox,并且官方也还没支持6.0+。
然后我就去GitHub官方仓库上找issues,还真让我找到了其它网友的PR
相关PR
6.1传送门
git clone https://github.com/cesium147/phpvirtualbox.git
cd phpvirtualbox
docker build itmx/phpvirtualbox:6.1 .
构建成功后,我把配置文件config.php
从GitHub复制下来,修改以下几处
#这里的密码填写上面创建用户时设置的密码
var $username = 'vbox';
var $password = '***********';
#因为等会docker会以host的网络运行,这行保持不变
var $location = 'http://127.0.0.1:18083/';
#把这行的注释取消,然后改为0.0.0.0
#var $vrdeaddress = '192.168.1.1';
var $vrdeaddress = '0.0.0.0';
#取消网页认证,把这行的注释取消
#var $noAuth = true;
var $noAuth = true;
接下来就是运行了
docker run -d --name vbox_http --net host -v $pwd/config.php:/var/www/html/config.php itmx/phpvirtualbox:6.1
启动了之后就得开放防火墙了
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=0.0.0.0 port port=80 protocol=tcp accept'
firewall-cmd --reload
打开浏览器进行测试
其实我折腾很久才成功到达这一步的!如果打开这个页面出错,那只能找Google或者Baidu解和自己对vbox的理解进行排查了
安装Android x86架构的系统镜像
先下载镜像
下载地址
下载之后放在服务器上
然后在网页上像在Windows下使用vbox一样创建一个虚拟机了
创建好虚拟机之后,选择刚刚下载的镜像,然后运行
这个时候,我们需要通过远程桌面进行操作了,我们上面安装的扩展包就包含了远程桌面功能。
官方VRDP参考
我本来也是准备使用webrdp之类的工具的,不依赖Windows的远程桌面,但是找了几分钟还没找到合适的,以后再找了。
vbox默认使用了9000端口接收远程控制,所以我们先在服务器开放一下9000端口
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=0.0.0.0 port port=9000 protocol=tcp accept'
firewall-cmd --reload
然后使用Windows的远程桌面连接虚拟机192.168.1.88:9000
接下来的工作就参考下面这篇文章吧:
VirtualBox中安装Android-x86详解
安装完成后我并没有成功的运行那个开门APP,因为那个APP是arm架构的,并不支持运行在x86的机器上,所以,我换了种方案,请看下集。
当然,也有一些貌似可以解决arm的app运行在x86架构的方案:
Android原生模拟器运行ARM APP
Android x86 下运行纯ARM版APP
the default ARM translation layer for x86
Android-X86集成houdini(Arm兼容工具)
参考链接
打造基于 Centos 7.X 的 VBox 服务器
Centos7 升级内核版本
关于docker容器访问的主机的端口问题
Cannot login to vboxwebsrv
Support for Virtualbox 6.1 #210 #213
centos7.5安装VirtualBox
Centos7 升级内核版本
Remote Display (VRDP Support)
VirtualBox中安装Android-x86详解
A pure Node.js Microsoft Remote Desktop Protocol (RDP) Client
phpvirtualbox | google code