檢測Android應用程式在安卓模擬器中運行的方法及系統與流程
2023-07-25 15:13:26 3

本發明涉及安卓模擬器配置領域,具體涉及一種檢測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應用程式未在安卓模擬器中運行。
進一步,本發明不局限於上述實施方式,對於本技術領域的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也視為本發明的保護範圍之內。本說明書中未作詳細描述的內容屬於本領域專業技術人員公知的現有技術。