android 模拟器识别,一种基于符号的识别Android应用运行在模拟器中的方法与流程...

1401e520e31c42d064a27cdd843e161d.gif

本发明涉及一种基于符号的识别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),如果包含,则可以确认应用的运行环境是模拟器。

以上,仅为本发明较佳的具体实施方式;但本发明的保护范围并不局限于此。任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其改进构思加以等同替换或改变,都应涵盖在本发明的保护范围内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值