我最近做一个Android应用加固的项目,其中有一个在线认证的功能。在项目进行过程中会对应用进行加固,并将一些加密码之类的信息存入数据库,然后加固后的应用在运行时则需要访问数据库获得加密码等信息后进行解密。在这个过程中,成功的将信息写入了数据库中,但是在Android应用运行时却始终无法访问到虚拟机上的server服务器,也就无法获得数据库信息。
一开始我在santoku上运行ifconfig命令,获得了如下信息
可以看到这个santoku系统的IP地址为10.0.2.15,这是它的内部地址,不是公网IP,它在访问外网时会进行IP地址的转换。但是外部设备如果想访问这个系统的话则不能直接通过10.0.2.15这个IP进行访问,此时我们可以在virtualbox虚拟机的设置页面进行端口转发。设置过程如下
在上面这个页面上点击端口转发,跳出设置页面,如下所示
上面的设置中会将发往host主机,也就是本计算机的8888端口信息转发到虚拟机的8888端口上,从而实现了外部网络访问虚拟机信息。在虚拟机上要打开一个server服务器来接受来自8888端口的连接。
打开Android模拟器,在CMD窗口下运行adb shell命令,接着在shell窗口下输入getprop命令来获取系统信息,在显示的系统信息列表中查找[net.gprs.local-ip]: [10.0.2.15]信息即为Android模拟器的内网IP地址,如图所示
可以从红色方框看出模拟器IP地址为10.0.2.15,另外本机的内网IP地址则为10.0.2.2
因为Android模拟器处于一个本地电脑与Android模拟器组成的内部网络中,所以如果Android模拟器想访问本地电脑上的虚拟机,则必须首先访问本地电脑,再通过virtualbox虚拟机的端口转发功能访问到虚拟机上的信息。因此,Android模拟器在与虚拟机上的服务器建立连接时设置的目的IP地址应该为10.0.2.2,这样Android模拟器就可以正常访问虚拟机上的服务器了,从而获得虚拟机上的数据库信息。