一種基于IDA通信的Android應(yīng)用反調(diào)試方法
【專利摘要】本發(fā)明公布了一種基于IDA通信的Android應(yīng)用反調(diào)試方法,將反調(diào)試程序?qū)懺贏ndroid應(yīng)用程序中,通過JNI_OnLoad實現(xiàn)加載,在Android應(yīng)用程序運行時首先運行反調(diào)試程序;反調(diào)試方法包括一般反調(diào)試檢測、IDA通信檢測和跟蹤檢測;在一般反調(diào)試檢測時,檢測硬件信息,當(dāng)檢測到模擬器或調(diào)試器信息時,退出該應(yīng)用;再檢測時間差,當(dāng)沒有被單步調(diào)試執(zhí)行的進(jìn)程時,退出應(yīng)用;檢測IDA通信端口和進(jìn)程,當(dāng)狀態(tài)為建立連接時,往下運行;否則退出;檢測通信模式,當(dāng)存在IDA調(diào)試時,退出應(yīng)用;檢測IDA進(jìn)程跟蹤,當(dāng)存在被調(diào)試的IDA程序時,退出應(yīng)用;否則,繼續(xù)正常運行該Android應(yīng)用。利用本發(fā)明方法,可有效地對Android應(yīng)用程序進(jìn)行版權(quán)保護(hù),防止其被調(diào)試。
【專利說明】
一種基于I DA通信的Android應(yīng)用反調(diào)試方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及IDA通信檢測和應(yīng)用軟件反調(diào)試技術(shù),尤其涉及一種基于IDA通信(Interactive DisAssembler,交互式反匯編器)的Android應(yīng)用反調(diào)試方法。
【背景技術(shù)】
[0002]隨著計算機(jī)技術(shù)應(yīng)用日益普及,Android智能終端的快速發(fā)展,Android軟件產(chǎn)業(yè)得以飛速發(fā)展,與此同時,攻擊者利用Android軟件逆向技術(shù)對軟件的各種攻擊和未授權(quán)使用以及盜版復(fù)制等行為也越來越多。Android逆向分析技術(shù)可以被用來在不知道應(yīng)用程序源代碼的情況下分析應(yīng)用程序的功能流程、篡改應(yīng)用程序的數(shù)據(jù)代碼等,逆向分析技術(shù)如果被不加限制的惡意使用,利用者可以分析獲取應(yīng)用程序的核心技術(shù),也可以篡改應(yīng)用程序的簽名和作者信息,還可以將惡意代碼注入到已有的應(yīng)用程序中并通過二次打包進(jìn)行偽裝,這些行為都極大的危害了應(yīng)用程序開發(fā)者的利益,嚴(yán)重?fù)p害了廣大用戶的隱私安全。在Android軟件逆向技術(shù)中,Android調(diào)試技術(shù)是一個非常重要的組成部分。通過進(jìn)行Android應(yīng)用的調(diào)試,可以得到Android應(yīng)用的運行流程,推斷出Android應(yīng)用的基本原理,通??梢苑浅m樌铱焖俚乩@過一些登陸限制或功能限制,獲取到一些用戶私密信息,具有較大的危害。
[0003]IDA Pr ο名稱為交互式反匯編器專業(yè)版(I n t era c t i ve DisassemblerProfess1nal),人們常稱其為IDA Pro,或簡稱為IDA,是Hex-Rayd公司的一款產(chǎn)品。就其本質(zhì)而言,IDA是一種遞歸下降反匯編器。除反匯編過程本身外,IDA在區(qū)分?jǐn)?shù)據(jù)與代碼的同時,還設(shè)法確定這些數(shù)據(jù)的類型。雖然在IDA中看到的是匯編語言形式的代碼,但I(xiàn)DA的主要目標(biāo)之一在于,呈現(xiàn)盡可能接近源代碼的代碼。此外,IDA不僅使用數(shù)據(jù)類型信息,而且通過派生的變量和函數(shù)名稱來盡其所能地注釋生成的反匯編代碼。這些注釋將原始十六進(jìn)制代碼的數(shù)量減到最少,并顯著增加了向用戶提供的符號化信息的數(shù)量。IDA在版本4.5中引入了一個調(diào)試器,從而鞏固了 IDA作為一種常用逆向工程工具的地位。在隨后的版本中,IDA的調(diào)試功能不斷擴(kuò)展。IDA的最新版本能夠在各種不同的平臺上進(jìn)行本地和遠(yuǎn)程調(diào)試,并支持許多不同的處理器。近年來,隨著IDA Pro功能的不斷完善,IDA Pro作為調(diào)試器的功能也越來越突出。
[0004]IDA調(diào)試器可以進(jìn)行本地調(diào)試和遠(yuǎn)程調(diào)試。對本地調(diào)試而言,只能調(diào)試可在你的平臺上運行的二進(jìn)制文件。對于在其他平臺或CPU上運行的二進(jìn)制文件,沒有模擬層允許它們在IDA的本地調(diào)試器中運行。至于遠(yuǎn)程調(diào)試,IDA自帶了許多調(diào)試服務(wù)器,包括用于Windows32/64、Windows CE/ARM、Mac OS X 32/64、Linux 32/64/ARM和Android的服務(wù)器。調(diào)試服務(wù)器旨在與要調(diào)試的二進(jìn)制文件并行執(zhí)行。運行遠(yuǎn)程調(diào)試服務(wù)器后,IDA將能夠與該服務(wù)器通信,在遠(yuǎn)程計算機(jī)上啟動目標(biāo)進(jìn)程,或依附到該進(jìn)程。因此IDA對于Android應(yīng)用的調(diào)試主要是采用遠(yuǎn)程調(diào)試技術(shù)。
[0005]IDA調(diào)試Android應(yīng)用的一般流程如下:1、要開始調(diào)試,首先需要在進(jìn)行進(jìn)程調(diào)試的計算機(jī)上啟動相應(yīng)的調(diào)試服務(wù)器組件。如果要將Windows版本的IDA作為調(diào)試客戶端,并且希望遠(yuǎn)程調(diào)試Android應(yīng)用程序,則除了要調(diào)試的二進(jìn)制文件外,只需復(fù)制android_server文件并賦予其相關(guān)的權(quán)限在Android系統(tǒng)上執(zhí)行該文件,android_server進(jìn)程啟動后默認(rèn)會監(jiān)聽23946端口。2、通過adb(Android Debug Bridge ,Android調(diào)試橋)進(jìn)行tcp端口轉(zhuǎn)發(fā),默認(rèn)端口為23946,例如“adb forward tcp: 23946tcp: 23946”。3、調(diào)試模式啟動程序adb shell am start-D-n包名/類名。Android應(yīng)用會彈出”Waitting for debugger”對話。4、啟動IDA,點擊”Debugger->Attach_>Remote ArmLinux/Android debugger”進(jìn)行基本的設(shè)置。然后選中要調(diào)試的進(jìn)程,將調(diào)試程序attach到該進(jìn)程上去。5、然后可以執(zhí)行要進(jìn)行的調(diào)試操作。從IDA調(diào)試Andro i d應(yīng)用的一般流程中可以看出IDA調(diào)試Andro id應(yīng)用的基本原理,IDA在調(diào)試Android應(yīng)用時通過與調(diào)試服務(wù)器進(jìn)行通信,建立TCP連接,監(jiān)測并控制Andr ο i d應(yīng)用進(jìn)程的運行情況,實現(xiàn)調(diào)試Andr o i d應(yīng)用的功能。
[0006]反調(diào)試是指通過多種檢測方法來判斷是否有調(diào)試器存在或者有調(diào)試程序的進(jìn)程存在,從而阻止Android應(yīng)用被調(diào)試。目前針對Android應(yīng)用的反調(diào)試技術(shù)主要通過檢測時間差來檢測是否中間有被單步調(diào)試執(zhí)行;檢測是否加載了 com.android, reverse,檢測到則直接退出;檢測手機(jī)上的一些硬件信息,判斷是否在模擬器或調(diào)試器中;基于Ptrace系統(tǒng)調(diào)用的反調(diào)試技術(shù)等方法。
[0007]綜上,目前雖然提出了一些反調(diào)試方法,但多數(shù)是通用方法,并沒有專門針對IDA進(jìn)行反調(diào)試的技術(shù)。
【發(fā)明內(nèi)容】
[0008]為了克服上述現(xiàn)有技術(shù)的不足,本發(fā)明提供一種基于IDA通信(InteractiveDisAssembler,交互式反匯編器)的Android應(yīng)用反調(diào)試方法,涉及到一般反調(diào)試檢測,IDA通信檢測,IDA進(jìn)程跟蹤檢測等方法,使得IDA不能對Android應(yīng)用進(jìn)行調(diào)試;另外,需保證加入反調(diào)試代碼的Android應(yīng)用可以正常執(zhí)行;從而達(dá)到保護(hù)版權(quán),防止他人剽竊軟件中的智力成果或?qū)浖M(jìn)行有目的的篡改的目的。
[0009]本發(fā)明的原理是:一個Android應(yīng)用在打包成APK文件之后,APK中會包含dex文件、so文件、資源文件和框架文件。本發(fā)明提供的基于IDA通信的Android應(yīng)用反調(diào)試方法,其前提是在Android應(yīng)用運行時,要在程序運行時首先運行反調(diào)試程序,實現(xiàn)方法是將反調(diào)試程序?qū)懺趕o文件中,通過JNI_0nLoad實現(xiàn)加載。Java Native Interface(JNI)標(biāo)準(zhǔn)是java平臺的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。JNI是本地編程接口,它使得在Java虛擬機(jī)(VM)內(nèi)部運行的Java代碼能夠與用其它編程語言(如C、C++和匯編語言)編寫的應(yīng)用程序和庫進(jìn)行交互操作。當(dāng)Android的VM(Virtual Machine)執(zhí)行到System.1oadLibraryO函數(shù)時,首先會去執(zhí)行以且件里的JNI_0nLoad()函數(shù)。反調(diào)試方法的整體的流程是首先進(jìn)行一般反調(diào)試檢測,使用通用的檢測方法將明顯的調(diào)試檢測出來。然后進(jìn)行IDA通信檢測,針對IDA調(diào)試進(jìn)行檢測,判斷是否存在IDA調(diào)試。最后進(jìn)行IDA進(jìn)程跟蹤檢測,判斷是否存在IDA跟蹤進(jìn)程。整個過程在Android應(yīng)用運行時同時循環(huán)執(zhí)行,確保實現(xiàn)反調(diào)試功能,阻止IDA Pro軟件進(jìn)行Android應(yīng)用調(diào)試。
[0010]本發(fā)明提供的技術(shù)方案是:
[0011 ] —種基于IDA通信的Android應(yīng)用反調(diào)試方法,將反調(diào)試程序?qū)懺贏ndroid應(yīng)用程序中,通過JNI_0nLoad實現(xiàn)加載,在Android應(yīng)用程序運行時首先運行所述反調(diào)試程序;所述反調(diào)試方法包括一般反調(diào)試檢測、IDA通信檢測和跟蹤檢測;具體包括如下步驟,
[0012]A.在一般反調(diào)試檢測時,執(zhí)行如下操作:
[0013]Al.檢測硬件信息,判斷Android應(yīng)用程序是否在模擬器或調(diào)試器中,當(dāng)檢測到模擬器或調(diào)試器信息時,強(qiáng)制退出該Android應(yīng)用,不讓該Android應(yīng)用被調(diào)試;反之,則不做操作,繼續(xù)執(zhí)行;
[0014]A2.通過檢測時間差,判斷是否有被單步調(diào)試執(zhí)行的進(jìn)程;當(dāng)有被單步調(diào)試執(zhí)行的進(jìn)程時,往下運行;否則退出程序強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試;
[0015]B.在進(jìn)行IDA通信檢測時,執(zhí)行如下操作:
[0016]B1.檢測IDA通信中所使用的端口,讀取通信連接進(jìn)程文件,當(dāng)狀態(tài)為建立連接時,往下運行;否則退出應(yīng)用程序,停止調(diào)試;
[0017]B2.通過檢測通信模式是否符合IDA通信模式,判斷是否存在IDA調(diào)試;當(dāng)存在IDA調(diào)試時,退出應(yīng)用程序,停止調(diào)試;否則繼續(xù)運行;
[0018]C.在IDA進(jìn)程跟蹤檢測時,讀取Android應(yīng)用的進(jìn)程信息,根據(jù)進(jìn)程信息判斷是否存在IDA跟蹤進(jìn)程;當(dāng)存在被調(diào)試的IDA程序時,將該Android應(yīng)用退出;否則,該Android應(yīng)用程序繼續(xù)正常運行。
[0019]針對上述基于IDA通信的Android應(yīng)用反調(diào)試方法,進(jìn)一步地,Al所述硬件信息具體包括:“/dev/socket/qemud”通道、“/dev/qemu_pipe”通道、已知QEmu的驅(qū)動程序的列表、模擬器上特有文件信息、設(shè)備IDS信息、手機(jī)硬件信息、手機(jī)運營商家信息。
[°02°] 針對上述基于IDA通信的Andro id應(yīng)用反調(diào)試方法,進(jìn)一步地,A2通過檢測時間差來檢測是否中間有被單步調(diào)試執(zhí)行并處理,具體是:設(shè)置時間閾值,通過檢測進(jìn)程的運行時間與設(shè)置的時間閾值的時間差來判斷是否有被單步調(diào)試執(zhí)行的進(jìn)程,進(jìn)行如下處理:通過檢測進(jìn)程的運行時間,與設(shè)置的閾值進(jìn)行比較,判斷時間差是否符合要求。如果符合,則往下運行,否則退出程序強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試。
[0021 ] 針對上述基于IDA通信的Android應(yīng)用反調(diào)試方法,進(jìn)一步地,BI所述檢測IDA通信中所使用的端口為默認(rèn)端口 23946 ;所述通信連接為tcp連接,tcp連接信息包括本地地址端口 local_address()、遠(yuǎn)程地址端口:rem_address和連接狀態(tài)st。
[0022]B2所述通過檢測通信模式是否符合IDA通信模式,判斷是否存在IDA調(diào)試;具體包括如下過程:首先讀取proc/[pid]/net/tcp文件,獲取該文件中下存放進(jìn)程的tcp連接的信息;再通過tcp文件連接的狀態(tài)信息判斷是否存在IDA通信模式的TCP連接,進(jìn)一步獲得Android應(yīng)用是否被IDA調(diào)試。
[0023]針對上述基于IDA通信的Android應(yīng)用反調(diào)試方法,進(jìn)一步地,C所述IDA進(jìn)程跟蹤檢測,具體地,首先對/proc/[pid]/status文件進(jìn)行分析,獲得status文件的tracerpid屬性的值;再根據(jù)trac erp i d屬性的值,得到IDA程序是否被調(diào)試。
[0024]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
[0025]本發(fā)明提供一種基于IDA通信的Android應(yīng)用反調(diào)試方法,將反調(diào)試程序?qū)懺贏ndroid應(yīng)用程序中,通過JNI_0nLoad實現(xiàn)加載,在Android應(yīng)用程序運行時首先運行所述反調(diào)試程序;所述反調(diào)試方法包括一般反調(diào)試檢測、IDA通信檢測和跟蹤檢測。利用本發(fā)明提供的技術(shù)方案,可以有效地對Android應(yīng)用程序進(jìn)行版權(quán)保護(hù),防止其被調(diào)試。
【附圖說明】
[0026]圖1本發(fā)明提供的基于IDA通信的Android應(yīng)用反調(diào)試方法的整體流程框圖。
[0027]圖2本發(fā)明提供方法中的一般反調(diào)試檢測過程的流程框圖。
[0028]圖3本發(fā)明提供方法中的IDA通信檢測過程的流程框圖。
[0029]圖4本發(fā)明提供方法中的IDA進(jìn)程跟蹤檢測過程的流程框圖。
【具體實施方式】
[0030]下面結(jié)合附圖,通過實施例進(jìn)一步描述本發(fā)明,但不以任何方式限制本發(fā)明的范圍。
[0031 ] 本發(fā)明提供的基于IDA通信的Android應(yīng)用反調(diào)試方法,其前提是在Android應(yīng)用運行時,要在程序運行時首先運行反調(diào)試程序,實現(xiàn)方法是將反調(diào)試程序?qū)懺趕o文件中,通過JNI_0nLoad實現(xiàn)加載。
[0032]Java Native Interface(JNI)標(biāo)準(zhǔn)是java平臺的一部分。由于Android的應(yīng)用層的類都是以Java寫的,這些Java類編譯為Dex型式的Bytecode之后,必須靠Dalvik虛擬機(jī)(VM:Virtual Machine)來執(zhí)行。VM在Android平臺里,扮演很重要的角色。此外,在執(zhí)行Java類的過程中,如果Java類需要與C組件溝通時,VM就會去載入C組件,然后讓Java的函數(shù)順利地調(diào)用到C組件的函數(shù)。此時,VM扮演著橋梁的角色,讓Java與C組件能通過標(biāo)準(zhǔn)的JNI介面而相互溝通。應(yīng)用層的Java類是在虛擬機(jī)(VM: Vitual Machine)上執(zhí)行的,而C件不是在VM上執(zhí)行,那么Java程式又如何要求VM去載入(Load)所指定的C組件呢?可使用下述指令:
[0033]System.loadLibrary(*.so的檔案名);
[0034]當(dāng)Android的VM(VirtualMachine)執(zhí)行到System.loadLibrary()函數(shù)時,首先會去執(zhí)行C組件里的JNI_0nLoad()函數(shù)。它的用途有二:(一)是告訴VM此C組件使用那一個JNI版本。如果你的*.so檔沒有提供JNI_0nLoad()函數(shù),VM會默認(rèn)該*.so檔是使用最老的JNII.I版本。由于新版的JNI做了許多擴(kuò)充,如果需要使用JNI的新版功能,例如JNI 1.4的java.n1.ByteBuffer,就必須藉由JNI_0nLoad()函數(shù)來告知VM。(二)是由于VM執(zhí)行到System.1oadLibraryO函數(shù)時,就會立即先呼叫JNI_0nLoad(),所以(3組件的開發(fā)者可以藉由JNI_0nLoad()來進(jìn)行(:組件內(nèi)的初期值之設(shè)定(Initializat1n)。
[0035]反調(diào)試方法的整體的流程是首先進(jìn)行一般反調(diào)試檢測,如圖1所示,程序運行后的第一步就是進(jìn)行一般反調(diào)試檢測,使用通用的檢測方法將明顯的調(diào)試檢測出來,檢查是否存在模擬器或者時間差。然后如圖1所示進(jìn)行IDA通信檢測,針對IDA調(diào)試進(jìn)行檢測,判斷是否存在IDA調(diào)試。最后如圖1所示進(jìn)行IDA進(jìn)程跟蹤檢測,判斷是否存在IDA跟蹤進(jìn)程。整個過程在Android應(yīng)用運行時同時循環(huán)執(zhí)行,確保實現(xiàn)反調(diào)試功能。本發(fā)明提供的基于IDA通信的Android應(yīng)用反調(diào)試方法的流程如圖1所示,包括一般反調(diào)試檢測、IDA通信檢測和跟蹤檢測;具體包括如下步驟,
[0036]A.在一般反調(diào)試檢測時,執(zhí)行如下操作,具體流程如圖2所示:
[0037]Al.檢測硬件信息,判斷Android應(yīng)用程序是否在模擬器或調(diào)試器中,并處理:如果檢測到模擬器或調(diào)試器信息,則強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試;反之,則不做操作;
[0038]硬件信息具體包括:“/dev/socket/qemud”,“/dev/qemu_pipe”這兩個通道;已知QEmu的驅(qū)動程序的列表、模擬器上特有文件、設(shè)備IDS、手機(jī)硬件信息、手機(jī)運營商家等;模擬器是指主要透過軟件模擬硬件處理器的功能和指令系統(tǒng)的程序使計算機(jī)或者其他多媒體平臺(掌上電腦,手機(jī))能夠運行其他平臺上的軟件。模擬器是為了開發(fā)測試時在PC電腦上對于手機(jī)環(huán)境進(jìn)行模擬的一種軟件程序。一般地,調(diào)試器通過將Android應(yīng)用放在模擬器中運行來進(jìn)行調(diào)試,也可以在真機(jī)中進(jìn)行調(diào)試。一般認(rèn)為一個開發(fā)完成的Android應(yīng)用是不需要在模擬器中運行的,如果檢測到有模擬器,則認(rèn)為該Android應(yīng)用可能被調(diào)試。
[0039]本步驟可以通過檢測“/dev/socket/qemud”,“/dev/qemu_pipe”這兩個模擬器上特有的文件;檢測驅(qū)動文件內(nèi)容、讀取文件內(nèi)容,然后檢查已知QEmu的驅(qū)動程序的列表;檢測設(shè)備IDS是不是“000000000000000”;檢測手機(jī)上的一些硬件信息;檢測手機(jī)運營商家等信息監(jiān)測程序是否在真機(jī)上運行。如果為真機(jī),則往下運行,否則退出程序,強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試。
[0040]A2.通過檢測時間差來檢測是否中間有被單步調(diào)試執(zhí)行并處理。
[0041]具體通過檢測進(jìn)程的運行時間與設(shè)置的時間閾值的時間差來判斷是否有被單步調(diào)試執(zhí)行的進(jìn)程,進(jìn)行如下處理:通過檢測進(jìn)程的運行時間,與設(shè)置的閾值進(jìn)行比較,判斷時間差是否小于設(shè)置的閾值,如果小于設(shè)置的閾值,則說明不存在被單步調(diào)試執(zhí)行的進(jìn)程,否則,說明存在被單步調(diào)試執(zhí)行的進(jìn)程。因此,如果檢測到的進(jìn)程運行時間小于設(shè)置的閾值,則往下運行,否則退出程序強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試。
[0042]時間閾值設(shè)置與具體的進(jìn)程有關(guān),不同的進(jìn)程有不同的運行時間,時間閾值的設(shè)置一般要大于1000ms。時間閾值的具體設(shè)定要先測量具體進(jìn)程的正常運行時間,然后根據(jù)測量的時間設(shè)置閾值,具體的閾值可根據(jù)測量的時間憑經(jīng)驗設(shè)置,一般可以乘以20倍。
[0043]B.在進(jìn)行IDA通信檢測時,執(zhí)行如下操作,具體流程如圖3所示:
[0044]B1.檢測IDA通信中所使用的默認(rèn)端口 ;
[0045]具體地,檢測IDA通信中所使用的默認(rèn)端口 ;讀取proc/[pid]/net/tcp文件,tcp文件是一個進(jìn)程文件,其中[pid]代表該進(jìn)程的進(jìn)程號,tcp是文件名,在該文件中存放Android應(yīng)用程序所有tcp連接的信息,最主要的信息包括local_address (本地地址:端口)、rem_address(遠(yuǎn)程地址:端口)、st(連接狀態(tài))。對該文件進(jìn)行分析,查看是否存在TCP連接為默認(rèn)端口(即23946)且狀態(tài)為“OI”即TCP_ESTABLISHED(建立連接狀態(tài))。如果沒有建立TCP連接,則往下運行,否則退出程序,即強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試。
[0046]B2.檢測是否存在符合IDA通信模式的通信模式,判斷是否存在IDA調(diào)試;
[0047]具體地,讀取proc/[pid]/net/tcp文件,在該文件中下存放進(jìn)程的tcp連接的信息,對該文件進(jìn)行分析,檢測該文件的內(nèi)容,判斷是否存在IDA通信模式的TCP連接,根據(jù)IDA通信的原理,如果該文件中存在一對已經(jīng)建立的tcp連接,狀態(tài)為“01”(建立連接),并且還存在一個端口號與這對連接相同且狀態(tài)為“0A”(正在監(jiān)聽)的TCP狀態(tài)行,說明該Android應(yīng)用正在被IDA進(jìn)行調(diào)試。如果存在,則退出程序,否則繼續(xù)運行。
[0048]C.在IDA進(jìn)程跟蹤檢測時,執(zhí)行如下操作,具體流程如圖4所示:
[0049]讀取Android應(yīng)用進(jìn)程信息,根據(jù)進(jìn)程信息進(jìn)行判斷是否存在IDA跟蹤進(jìn)程并處理。
[0050]具體地,通過對/proc/[pid]/status文件進(jìn)行分析。該文件存放進(jìn)程的狀態(tài)信息;tracerpid是status文件中的一個屬性,其含義為是否有跟蹤進(jìn)程,如果有則顯示跟蹤進(jìn)程的進(jìn)程號,如果沒有,則顯示O。使用C語言的fopen函數(shù),fopen打開文件來檢測自己的進(jìn)程是否被attach( S卩是否被跟蹤),判斷/proc/[pid]/status文件中的tracerpid的值是否為0,如果為O說明沒有別的進(jìn)程在調(diào)試這個進(jìn)程,如果不為O說明有IDA程序正在被調(diào)試。如果被調(diào)試,則退出程序,強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試;否則,說明以上的檢測方法都沒有檢測到調(diào)試器,則認(rèn)為該Android應(yīng)用程序沒有被調(diào)試,則不用做任何操作,讓該Android應(yīng)用程序繼續(xù)正常運行。
[0051 ]下面通過實例對本發(fā)明做進(jìn)一步說明。
[°°52]本實施例對某個Android應(yīng)用進(jìn)行反調(diào)試檢測,在該Android應(yīng)用中使用了本發(fā)明提供的反調(diào)試方法。首先將反調(diào)試程序?qū)懺趕o文件中,通過JNI_0nLoad實現(xiàn)加載。
[°°53]本實施例采用C語言編寫反調(diào)試程序,然后編譯成so文件,命名為AntiDebug.so。在Andr ο id應(yīng)用中Andr oid程序啟動處添加
[0054]static{
[0055]System.1oadLibrary("AntiDebug");
[0056]}
[0057]即可將本發(fā)明的方法運用到Android應(yīng)用中。
[0058]經(jīng)檢測,加入該反調(diào)試程序后對于該應(yīng)用的功能沒有影響。在不進(jìn)行IDA調(diào)試時,該程序正常運行。然后按照IDA調(diào)試Android應(yīng)用的流程,對于該Android應(yīng)用進(jìn)行調(diào)試。該實施例主要對該反調(diào)試方法的核心功能IDA通信檢測進(jìn)行測試。
[0059]首先需要在進(jìn)行進(jìn)程調(diào)試的計算機(jī)上啟動相應(yīng)的調(diào)試服務(wù)器組件。將Windows版本的IDA作為調(diào)試客戶端(除了 IDA作為調(diào)試器之外,還可用gdb等其他工具),將真機(jī)作為調(diào)試服務(wù)器,遠(yuǎn)程調(diào)試該Android應(yīng)用程序,復(fù)制android_server文件并賦予其相關(guān)的權(quán)限到Android系統(tǒng)上執(zhí)行該文件,android_server進(jìn)程啟動后會監(jiān)聽23946端口。
[0060]此操作在PC端實施,IDA調(diào)試客戶端是運行在PC電腦上的一個具有圖形界面的程序。通過pc端的命令,即使用cmd將IDA中提供的android_server文件導(dǎo)入到模擬器或真機(jī)中(模擬器或真機(jī)就是Android系統(tǒng),也就是調(diào)試服務(wù)器),然后通過PC端的命令啟動android_server,讓其運行。
[0061]賦予相關(guān)的權(quán)限具體是:
[0062]adb shell chmod 755/data/data/android_server
[0063]即權(quán)限為755,也就是rwxr-xr-x ;
[0064]即第一位7等于4+2+1,rwx,所有者具有讀取、寫入、執(zhí)行權(quán)限,第二位5等于4+0+1,r-x,同組用戶有讀取、執(zhí)行權(quán)限、第三位4,也是r-x,其他用戶有讀取、執(zhí)行權(quán)限。
[0065]然后在adb模式下進(jìn)行tcp端口轉(zhuǎn)發(fā),例如 “adb forward tcp: 23946tcp: 23946”。再然后調(diào)試模式啟動程序adb shell am start-D_n包名/類名。Android應(yīng)用會彈出”ffaitting for debugger”對話。啟動IDA,點擊“Debugger->Attach->Remote ArmLinux/Android debugger”進(jìn)行基本的設(shè)置。然后選中要調(diào)試的進(jìn)程,將調(diào)試程序attach(即是否被附著、被跟蹤)到該進(jìn)程上去??梢杂^察到該Android應(yīng)用退出。說明使用本發(fā)明的反調(diào)試方法的該Android應(yīng)用檢測到被調(diào)試,該反調(diào)試方法有效。
[0066]對于該調(diào)試流程進(jìn)行分析,對于整體流程中的A步驟:一般反調(diào)試檢測部分,由于是在真機(jī)中進(jìn)行檢測,所以在一般反調(diào)試檢測部分沒有檢測到處于IDA調(diào)試狀態(tài)。在一般反調(diào)試檢測部分,首先檢測“/dev/socket/qemud”,“/dev/qemu_pipe”這兩個特有的文件;檢測驅(qū)動文件內(nèi)容、讀取文件內(nèi)容,然后檢查已知QEmu的驅(qū)動程序的列表檢測設(shè)備IDS(即設(shè)備默認(rèn)id)是不是“000000000000000”,如果是,則說明該Android應(yīng)用程序運行在模擬器中,如果不是,說明該設(shè)備在真機(jī)中運行;檢測手機(jī)上的一些硬件信息,如android.0s.Bui Id.B OARD 主板、android.0s.Build.BRAND an dro id系統(tǒng)定制商、android.0s.Build.DEVICE 設(shè)備參數(shù)、android.0s.Build.MODEL 片反本、android.0s.Build.PRODUCT手機(jī)制造商等信息;在本實例中這些信息全部符合正常的運行情況,如android.0s.Bui Id.BOARD主板信息不等于"unknown"。同時檢測時間差時沒有發(fā)現(xiàn)時間差超過閾值,因此程序會繼續(xù)運行。
[0067]當(dāng)進(jìn)入到核心功能B步驟:進(jìn)行IDA通信檢測時,會檢測到存在TCP端口為IDA默認(rèn)端口 23946且狀態(tài)為“01”,因此會退出程序。如果在調(diào)試過程中改變IDA調(diào)試的設(shè)置,將端口號隨意設(shè)置(端口號可不使用默認(rèn)端口,可設(shè)置為其他的端口號),進(jìn)行調(diào)試時,該方法在步驟A時不會變化,當(dāng)?shù)竭_(dá)步驟B,首先沒有檢測到TCP端口為默認(rèn)端口,會繼續(xù)運行。然后,該程序會檢測proc/[pid]/net/tcp文件,發(fā)現(xiàn)存在符合IDA通信模式的TCP連接,該程序會退出。
[0068]對于步驟C:1DA進(jìn)程跟蹤檢測,由于在進(jìn)行IDA調(diào)試時,運行到步驟B就會退出,因此,先將步驟B刪除進(jìn)行測試。本實施例采用刪除步驟B(即不執(zhí)行步驟B)對步驟C進(jìn)行測試,按照IDA調(diào)試流程,步驟A相同,在步驟C中對/proc/[pid]/status這個文件進(jìn)行分析。用fopen打開文件來檢測自己的進(jìn)程是否被attach,判斷/proc/[pid]/status這個文件中的tracerpid的值是否為0,可以發(fā)現(xiàn)tracerpid的值不為0,因此檢測到有IDA進(jìn)行調(diào)試,程序退出。
[0069]需要注意的是,公布實施例的目的在于幫助進(jìn)一步理解本發(fā)明,但是本領(lǐng)域的技術(shù)人員可以理解:在不脫離本發(fā)明及所附權(quán)利要求的精神和范圍內(nèi),各種替換和修改都是可能的。因此,本發(fā)明不應(yīng)局限于實施例所公開的內(nèi)容,本發(fā)明要求保護(hù)的范圍以權(quán)利要求書界定的范圍為準(zhǔn)。
【主權(quán)項】
1.一種基于IDA通信的Android應(yīng)用反調(diào)試方法,將反調(diào)試程序?qū)懺贏ndroid應(yīng)用程序中,通過JNI_0nLoad實現(xiàn)加載,在Android應(yīng)用程序運行時首先運行所述反調(diào)試程序;所述反調(diào)試方法包括一般反調(diào)試檢測、IDA通信檢測和進(jìn)程跟蹤檢測;具體包括如下步驟, A.在一般反調(diào)試檢測時,執(zhí)行如下操作: Al.檢測硬件信息,判斷Android應(yīng)用程序是否在模擬器或調(diào)試器中,當(dāng)檢測到模擬器或調(diào)試器信息時,強(qiáng)制退出該Android應(yīng)用,不讓該Android應(yīng)用被調(diào)試;反之,則不做操作,繼續(xù)執(zhí)行; A2.通過檢測時間差,判斷是否有被單步調(diào)試執(zhí)行的進(jìn)程;當(dāng)有被單步調(diào)試執(zhí)行的進(jìn)程時,往下運行;否則退出程序強(qiáng)制將該Android應(yīng)用退出,不讓該應(yīng)用被調(diào)試; B.在進(jìn)行IDA通信檢測時,執(zhí)行如下操作: B1.檢測IDA通信中所使用的端口,讀取通信連接進(jìn)程文件,當(dāng)狀態(tài)為建立連接時,往下運行;否則退出應(yīng)用程序,停止調(diào)試; B2.通過檢測通信模式是否符合IDA通信模式,判斷是否存在IDA調(diào)試;當(dāng)存在IDA調(diào)試時,退出應(yīng)用程序,停止調(diào)試;否則繼續(xù)運行; C.在IDA進(jìn)程跟蹤檢測時,讀取Android應(yīng)用的進(jìn)程信息,根據(jù)進(jìn)程信息判斷是否存在IDA跟蹤進(jìn)程;當(dāng)存在被調(diào)試的IDA程序時,將該Android應(yīng)用退出;否則,該Android應(yīng)用程序繼續(xù)正常運行。2.如權(quán)利要求1所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,A1所述硬件信息具體包括:“/dev/socket/qemud”通道、“/dev/qemu_pipe”通道、已知QEmu的驅(qū)動程序的列表、模擬器上文件信息、設(shè)備IDS信息、手機(jī)硬件信息和手機(jī)運營商家信息。3.如權(quán)利要求1所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,A2通過檢測時間差來檢測是否中間有被單步調(diào)試執(zhí)行并處理,具體是:設(shè)置時間閾值,通過檢測進(jìn)程的運行時間與設(shè)置的時間閾值的時間差來判斷是否有被單步調(diào)試執(zhí)行的進(jìn)程,當(dāng)檢測到不存在被單步調(diào)試執(zhí)行的進(jìn)程,繼續(xù)運行所述Android應(yīng)用;否則退出程序。4.如權(quán)利要求3所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,當(dāng)檢測到進(jìn)程運行時間小于所述設(shè)置的時間閾值時,不存在被單步調(diào)試執(zhí)行的進(jìn)程。5.如權(quán)利要求3所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,所述時間閾值設(shè)置為大于100ms。6.如權(quán)利要求1所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,BI所述檢測IDA通信中所使用的端口為默認(rèn)端口 23946;所述通信連接為tcp連接,tcp連接信息包括本地地址端口 local_address()、遠(yuǎn)程地址端口:rem_address和連接狀態(tài)st。7.如權(quán)利要求6所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,B2所述通過檢測通信模式是否符合IDA通信模式,判斷是否存在IDA調(diào)試;具體包括如下過程: 讀取proc/[pid]/net/tcp文件,獲取該文件中下存放進(jìn)程的tcp連接的信息; 通過tcp文件連接的狀態(tài)信息判斷是否存在IDA通信模式的TCP連接,進(jìn)一步獲得Android應(yīng)用是否被IDA調(diào)試。8.如權(quán)利要求1所述基于IDA通信的Android應(yīng)用反調(diào)試方法,其特征是,C所述IDA進(jìn)程跟蹤檢測,具體地,首先對/proc/[pid]/status文件進(jìn)行分析,獲得status文件的tracerpid屬性的值;再根據(jù)tracerpid屬性的值,得到IDA程序是否被調(diào)試。
【文檔編號】G06F21/56GK106055983SQ201610603109
【公開日】2016年10月26日
【申請日】2016年7月27日 公開號201610603109.3, CN 106055983 A, CN 106055983A, CN 201610603109, CN-A-106055983, CN106055983 A, CN106055983A, CN201610603109, CN201610603109.3
【發(fā)明人】文偉平
【申請人】北京鼎源科技有限公司