本发明涉及一种基于符号的识别android应用运行在模拟器中的方法。
背景技术:
很多的移动应用都会使用一种基于lbs的地理围栏的技术(如移动打卡),某些用户为了突破这种围栏的限制,将移动应用运行在模拟器中,通过模拟器欺骗移动应用,从而突破围栏的限制。这个时候往往需要有能力来判断移动应用是否运行在模拟器中。
当前的android应用(移动应用的一种)具有非常多的方法来判断应用是否运行于模拟器中,如imei、cpu信息、电池信息、build信息(包括fingerprint、model、manufacturer、brand、device、product等)等信息。
现有方法的一个特点是都是通过系统提供的api获取,大部分模拟器可修改这些api的返回值,因此,这些方法都很难准确判断应用是否运行于模拟器中。
技术实现要素:
本发明的目的在于针对现有技术的不足,提供一种基于符号的识别android应用运行在模拟器中的方法。
为了解决上述技术问题,采用如下技术方案:
一种基于符号的识别android应用运行在模拟器中的方法,其特征在于包括以下步骤:
(1)读取/proc/self/maps文件,解析maps文件中的每一行,根据maps格式解析出应用所加载的所有模块的信息;
(2)根据所述模块的路径信息,筛选出so模块,过滤不搜索符号的模块;
(3)根据所述so模块的信息以此从so模块的开始内存地址解析、遍历模块的符号;
(4)将内存地址解析、遍历模块的符号与搜索的符号对比,如果符号名称相同,则认为在相应的模块中找到搜索的符号,认为运行环境是模拟器。
进一步,在所述步骤(2)中,在筛选出so模块,过滤不搜索符号的模块之前,先判断所述模块的信息的数据的格式是否符合maps文件的格式,如果符合maps文件的格式,则开始过滤不搜索符号的模块,如果不符合maps文件的格式,返回步骤(1)。
进一步,在所述步骤(2)中,所述筛选出so模块,过滤不搜索符号的模块的方法如下:从maps格式解析出应用所加载的所有模块的信息中,先筛选出含有带有so模块代码对应的内存段,然后从所述内存段对应的so模块是否是需要查找符号的模块,如果是需要查找符号的模块,进行步骤(3),所述不是需要查找符号的模块,返回步骤(1)。
名词解释:
lbs:基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如gsm网、cdma网)或外部定位方式(如gps)获取移动终端用户的位置信息(地理坐标,或大地坐标),在地理信息系统(外语缩写:gis、外语全称:geographicinformationsystem)平台的支持下,为用户提供相应服务的一种增值业务。
android模拟器:一个可以运行在电脑上的虚拟设备,android模拟器可以让你不需使用物理设备即可预览、开发和测试android应用程序,也可运行实际的应用。
模块:so模块,是指动态加载到内存中的一个so文件实体。
符号:程序源代码中的标识符,包括函数名称、变量名称等。
符号表:用于存储符号的一种数据结构,通过其可遍历模块中的所有符号。
由于采用上述技术方案,具有以下有益效果:
本发明为一种基于符号的识别android应用运行在模拟器中的方法,本发明通过对比现有模拟器与真机之间现实的差异,通过非api的方法准确判断android应用是否运行于模拟器中。具有优点如下:
本发明方法不读取磁盘文件(/proc/self/maps是虚拟文件系统,不是磁盘文件),都是在内存的读写操作,速度较快。
本发明方法不通过api调用,不容易受到模拟器的欺骗。
附图说明
下面结合附图对本发明作进一步说明:
图1为本发明一种基于符号的识别android应用运行在模拟器中的方法的流程示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明了,下面通过附图及实施例,对本发明进行进一步详细说明。但是应该理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
请参阅图1,一种基于符号的识别android应用运行在模拟器中的方法,其特征在于包括以下步骤:
读取/proc/self/maps文件,解析maps文件中的每一行,根据maps格式解析出应用所加载的所有模块的信息;
maps文件是linux系统的内存映射表文件,每一行表示内存中的一段内存,包括内存段的开始和结束地址,内存权限(有执行权限的是代码段)以及映射到该内存段的文件(如果有的话),通过maps文件可以得到进程所有代码段的地址范围以及映射到此代码段的so模块的信息。
(2)根据所述模块的路径信息,筛选出so模块,过滤不搜索符号的模块;
(3)根据所述so模块的信息以此从so模块的开始内存地址解析、遍历模块的符号;
所述符号的格式为elf格式。
(4)将内存地址解析、遍历模块的符号与搜索的符号对比,如果符号名称相同,则认为在相应的模块中找到搜索的符号,认为运行环境是模拟器。
其中,比对的符号具体包括如下:
/system/lib/libandroid_runtime.so
模块的microvirt.gles.renderer
和ttvm.gles.renderer
/system/lib/libart.so
模块的microvirt.gles
/system/lib/libc.so
模块的init.nox.rc、init.svc.vbox86-setup、microvirt
具体的,在所述步骤(2)中,在筛选出so模块,过滤不搜索符号的模块之前,先判断所述模块的信息的数据的格式是否符合maps文件的格式,如果符合maps文件的格式,则开始过滤不搜索符号的模块,如果不符合maps文件的格式,返回步骤(1)。
具体的,在所述步骤(2)中,所述筛选出so模块,过滤不搜索符号的模块的方法如下:从maps格式解析出应用所加载的所有模块的信息中,先筛选出含有带有so模块代码对应的内存段,然后从所述内存段对应的so模块是否是需要查找符号的模块,如果是需要查找符号的模块,进行步骤(3),所述不是需要查找符号的模块,返回步骤(1)。
so模块代码对应的内存段是指:一个有代码的so模块在加载到系统中的时候都会将其代码数据映射到一个内存段(也就是该段内存存放代码数据)。
本发明通过对比现有模拟器与真机之间现实的差异,通过非api的方法准确判断android应用是否运行于模拟器中。该方法不依赖于系统api,通过解析某个特定模块(如/system/lib/egl目录下的所有so文件),遍历该模块中的所有符号,并检查其中是否包含特定的符号(如goldfish_get_egl_tls),如果包含,则可以确认应用的运行环境是模拟器。
以上,仅为本发明较佳的具体实施方式;但本发明的保护范围并不局限于此。任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其改进构思加以等同替换或改变,都应涵盖在本发明的保护范围内。