检测Android应用程序在安卓模拟器中运行的方法及系统与流程

文档序号:11154583阅读:870来源:国知局
检测Android应用程序在安卓模拟器中运行的方法及系统与制造工艺

本发明涉及安卓模拟器配置领域,具体涉及一种检测Android应用程序在安卓模拟器中运行的方法及系统。



背景技术:

随着通信技术的发展,安卓模拟器(在电脑上模拟安卓操作系统,并能安装、使用、卸载Android应用程序的软件,即电脑上能够操作安卓系统)已经广泛应用于社会之中;因为安卓模拟器能够修改各种移动终端配置参数,所以Hack能够通过安卓模拟器在电脑上伪造多台移动终端用户,还能够在安卓模拟器中篡改Android应用程序的数据达到“外挂”的目的。因此,为了保证Android应用程序的使用者安全,使用者需要得知Android应用程序的运行位置是在移动终端上,还是在电脑上的安卓模拟器中(Android应用程序的“BUG”只会在安卓模拟器中出现)。

目前,检测Android应用程序的运行位置的方法为:在移动终端上通过JAVA层代码来判断移动终端中是否存在安卓模拟器特有的进程通信通道和IMEI信息,若安卓模拟器特有的进程通信通道和IMEI(International Mobile Equipment Identity,国际移动设备身份码)信息均不存在与Android应用程序中,则说明Android应用程序未在安卓模拟器中运行,进而实现运行位置信息的获取。

但是,上述检测Android应用程序的运行位置的方法存在以下缺陷:对于HACK而言,JAVA层的代码比较容易被逆向出其实现原理,进而比较容易反编译成原始代码,而且运行位置信息、以及安卓模拟器特有的进程通信通道和IMEI信息,均容易被HACK所篡改,进而极大的降低检测的准确性,难以保证用户使用Android应用程序时的财产安全。



技术实现要素:

针对现有技术中存在的缺陷,本发明解决的技术问题为:检测Android应用程序是否运行在安卓模拟器中。本发明显著提高了检测的准确性,能够在用户使用Android应用程序时,保证用户的财产安全。

为达到以上目的,本发明提供的检测Android应用程序在安卓模拟器中运行的方法,包括以下步骤:

步骤A:移动终端运行需要检测的Android应用程序:

当通过JNI层判定移动终端中存在安卓模拟器特有的进程通信通道时,转到步骤B;

当通过JNI层判定移动终端中存在安卓模拟器特有的IMEI信息时,转到步骤B;

当通过JNI层判定移动终端中存在安卓模拟器特有的驱动文件时,转到步骤B;

当通过JNI层判定移动终端中存在安卓模拟器特有的模拟器文件时,转到步骤B;

当通过JNI层判定移动终端中存在安卓模拟器特有的电话号码时,转到步骤B;

当通过JNI层判定移动终端中存在安卓模拟器特有的Android Id时,转到步骤B;

当移动终端中不存在特有信息时,确定需要检测的Android应用程序未在安卓模拟器中运行;特有信息包括所述进程通信通道、IMEI信息、驱动文件、模拟器文件、电话号码和Android Id;

步骤B:确定需要检测的Android应用程序在安卓模拟器上运行。

与现有技术相比,本发明的优点在于:

(1)参见步骤A可知,本发明通过采集4个信息(安卓模拟器特有的进程通信通道、驱动文件、模拟器文件和IMEI信息),本发明只有在Android应用程序中未检测到上述4个信息中的任何1个,才确定Android应用程序未在安卓模拟器中运行。

与现有技术中通过JAVA采集2个信息(进程通信通道和IMEI信息)来检测Android应用程序是否在安卓模拟器中运行相比,本发明的检测标准至少提高1倍;而且本发明通过UNI层采集信息,与JAVA层编写的代码相比,破译和反编译UNI层的代码的难度非常高,进而显著提高了检测的准确性,在用户使用Android应用程序时,保证了用户的财产安全。

在此基础上,参见步骤A可知,本发明在上述4个信息的判断标准上增加了安卓模拟器特有的电话号码和Android Id的判断,即只有当特有电话号码、Android Id、以及上述4个信息均不存在于Android应用程序中,才确定Android应用程序未在安卓模拟器中运行,进一步提高了检测的准确性。

附图说明

图1为本发明实施例中检测Android应用程序在安卓模拟器中运行的方法的流程图。

具体实施方式

以下结合附图及实施例对本发明作进一步详细说明。

参见图1所示,本发明实施例中的检测Android应用程序在安卓模拟器中运行的方法,包括以下步骤:

S1:移动终端运行需要检测的Android应用程序,在移动终端的JNI层(用来沟通JAVA代码和外部的本地代码C或C++的协议层)上,读取fopen函数(打开文件函数);通过fopen函数,判断移动终端中是否存在安卓模拟器特有的进程通信通道,若不是,转到S2,若是,转到S8。

S1的进程通信通道包括"/dev/socket/qemud"和"/dev/qemu_pipe",S1的具体流程为:

S101:调用Android系统提供的API函数获取libc.so的句柄,其目的在于:打开文件函数fopen存在于Android系统的libc.so库中,获取libc.so的句柄能够直接读取libc.so库中的fopen函数,转到S102。

S101的具体实现方式为:

void*dlopen(const char*pathname,int mode);

在参数pathname中传入需要打开的SO的名字(即libc.so),在参数mode中传入打开方式(RTLD_NOW),需要解析符号。

S102:调用Android系统的API函数dlsym,通过libc.so的句柄打开fopen函数,转到S103。

S102的具体实现方式为:

void*dlsym(void*handle,const char*symbol);

在参数handle中传入libc.so的句柄,在参数symbol中传入fopen函数的名称。

S103:通过fopen函数分别打开进程通信通道"/dev/socket/qemud"和"/dev/qemu_pipe",函数fopen的原型为:

FILE*fopen(const char*path,const char*mode);

FILE为返回值,在参数path中传入进程通道的名称("/dev/socket/qemud"或"/dev/qemu_pipe"),在参数mode传入打开的方式。

打开"/dev/socket/qemud"时(fopen("/dev/socket/qemud",r),若FILE不为空(返回文件句柄),则确认"/dev/socket/qemud"打开且存在,即Android应用程序在电脑上的安卓模拟器中运行(安卓模拟器肯定会存在上述的通道来进行通信),转到S8。

打开"/dev/qemu_pipe"时(fopen("/dev/qemu_pipe",r),若FILE不为空(返回文件句柄),则确认"/dev/qemu_pipe"打开且存在,即Android应用程序在电脑上的安卓模拟器中运行(安卓模拟器肯定会存在上述的通道来进行通信),转到S8。

若打开上述2个进程通信通道的FILE均为空,则确认所有进程通信通道均未打开且不存在,转到S2。

S2:通过fopen函数,判断移动终端中是否存在安卓模拟器特有的驱动文件,若不是,转到S3,若是,转到S8。

S2的驱动文件为"/proc/tty/drivers",S2的具体流程为:

通过fopen函数打开驱动文件:fopen("/proc/tty/drivers",r);

若返回值FILE不为空,则确认驱动文件打开且存在,即Android应用程序在电脑上的安卓模拟器中运行;若FILE为空,则确认驱动文件未打开且不存在。

S3:通过fopen函数,判断移动终端中是否存在安卓模拟器的模拟器文件,若不是,转到S4,若是,转到S8。

S3的模拟器文件包括以下3份:

"/system/lib/libc_malloc_debug_qemu.so";

"/sys/qemu_trace";

"/system/bin/qemu-props";

S3的具体流程为:

通过fopen函数分别打开上述3份模拟器文件:

fopen("/system/lib/libc_malloc_debug_qemu.so",r);

fopen("/sys/qemu_trace",r);

fopen("/system/bin/qemu-props",r);

打开任意一份模拟器文件时,若返回值FILE不为空,则确认有模拟器文件存在且被打开,即Android应用程序在电脑上的安卓模拟器中运行。

打开所有模拟器文件时,若返回值FILE均为空,则确认所有模拟器文件均未打开且不存在。

S4:判断移动终端中是否存在安卓模拟器的特有的电话号码,若不是,转到S5,否则转到S8;具体实现方式为:

TelephonyManager tm=(TelephonyManager)

context.getSystemService(Context.TELEPHONY_SERVICE);

String phonenumber=telephonyManager.getLine1Number();

特有电话号码包括:

"15555215554","15555215556","15555215558","15555215560",

"15555215562","15555215564","15555215566","15555215568",

"15555215570",、"15555215572","15555215574","15555215576",

"15555215578","15555215580","15555215582","15555215584"。

S5:在JNI层上获取移动终端的Android Id,判断Android Id是否等于000000000000000,若是,转到S8,否则转到S6。

S5中获取移动终端的Android ID的具体流程为:

S501:通过Android系统提供的JNI层的API函数,获取getSystemService接口,转到S502。

S501的具体实现方式为:

jclass cls_context=

(*env)->FindClass(env,"android/content/Context");

cls_context为环境的上下文,env为JNI层提供的环境变量的接口指针,是JNI层调用其他API的接口。

jmethodID getSystemService=

(*env)->GetMethodID(env,cls_context,"getSystemService","(Ljava/lang/String;)Ljava/lang/Object;")。

S502:通过getSystemService接口,获取TELEPHONY_SERVICE属性,转到S503。

S502的具体实现方式为:

jfieldID TELEPHONY_SERVICE=(*env)->GetStaticFieldID(env,cls_context,"TELEPHONY_SERVICE","Ljava/lang/String;")。

S503:通过TELEPHONY_SERVICE属性,调用JNI层的接口获取TelephonyManager接口,转到S504。

S503的具体实现方式为:

jclass cls_tm=

(*env)->FindClass(env,"android/telephony/TelephonyManager")。

S504:通过TelephonyManager接口,获取getDeviceId接口(即提供获取Android ID的接口),转到S505。

S504的具体实现方式为:

jmethodID getDeviceId=(*env)->GetMethodID(env,cls_tm,"getDeviceId","()Ljava/lang/String;")。

S505:通过getDeviceId接口获取Android ID,具体实现方式为:

jstring deviceid=(*env)->CallObjectMethod(env,telephonymanager,getDeviceId);

其中deviceid即为Android ID。

S6:在JNI层上获取移动终端的IMEI信息,判断IMEI信息是否等于310260000000000,若是,转到S8,否则转到S7。

S6的具体流程为:

调用函数dlsym来获取system_property_get函数(即S1中libc.so的接口函数),dlsym函数原型为:

int_system_property_get(const char*name,char*value);

在参数name中传入system_property_get函数的名称,value代表获取的IMEI信息。若IMEI信息等于310260000000000,则确认Android应用程序在电脑上的安卓模拟器中运行(安卓模拟器中的IEMI信息为固定值)。

S7:确认Android应用程序未在安卓模拟器中运行,结束。

S8:确认Android应用程序在电脑上的安卓模拟器中运行,结束。

本发明实施例中的检测Android应用程序在安卓模拟器中运行的系统,包括设置于需要检测的Android应用程序的移动终端上的进程通信通道判断模块、IMEI信息判断模块、驱动文件判断模块、模拟器文件判断模块、电话号码判断模块、Android Id判断模块和检测结果模块。

进程通信通道判断模块用于:通过JNI层判断移动终端中是否存在安卓模拟器特有的进程通信通道(/dev/socket/qemud和/dev/qemu_pipe),若是,向检测结果模块发送模拟器运行信号,否则向检测结果模块发送进程通信通道排除信号。

进程通信通道判断模块的具体工作流程为:在JNI层上读取打开文件函数,判断是否能够通过打开文件函数打开所述进程通信通道,若是,则判定移动终端中存在该进程通信通道,否则判定移动终端中不存在该进程通信通道。

IMEI信息判断模块用于:通过JNI层判断移动终端中是否存在安卓模拟器特有的IMEI信息(310260000000000),若是,向检测结果模块发送模拟器运行信号,否则向检测结果模块发送IMEI信息排除信号。

驱动文件判断模块用于:通过JNI层判断移动终端中是否存在安卓模拟器特有的驱动文件(/proc/tty/drivers),若是,向检测结果模块发送模拟器运行信号,否则向检测结果模块发送驱动文件排除信号。

驱动文件判断模块的具体工作流程为:判断是否能够通过所述打开文件函数打开所述驱动文件,若是,则判定移动终端中存在该驱动文件,否则判定移动终端中不存在该驱动文件。

模拟器文件判断模块用于:通过JNI层判断移动终端中是否存在安卓模拟器特有的模拟器文件,若是,向检测结果模块发送模拟器运行信号,否则向检测结果模块发送模拟器文件排除信号。

所述模拟器文件包括/system/lib/libc_malloc_debug_qemu.so、/sys/qemu_trace以及/system/bin/qemu-props;模拟器文件判断模块的具体工作流程为:判断是否能够通过所述打开文件函数打开所述模拟器文件,若是,则判定移动终端中存在该模拟器文件,否则判定移动终端中不存在该模拟器文件。

电话号码判断模块用于:通过JNI层判断移动终端中是否存在安卓模拟器特有的电话号码,若是,向检测结果模块发送模拟器运行信号,否则向检测结果模块发送模拟器文件排除信号。

Android Id判断模块用于:通过JNI层判断移动终端中是否存在安卓模拟器特有的Android Id(000000000000000),若是,向检测结果模块发送模拟器运行信号,否则向检测结果模块发送模拟器文件排除信号。

检测结果模块用于:收到任意模块发的模拟器运行信号时,确定需要检测的Android应用程序在安卓模拟器上运行,收到所述系统中所有模块发送的排除信号时,确定需要检测的Android应用程序未在安卓模拟器中运行。

进一步,本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1